Jump to content

Trabalho de lixeiro em dupla


Recommended Posts

Ideia inicial para o script

Um trabalho em dupla de lixeiro, Os jogadores podem revezar em ser o motorista, e ambos podem coletar o lixo.
Objetivo: Recolher o lixo da cidade e voltar para o local de trabalho.

O que eu não faço ideia é como criar um grupo para os dois jogadores, deve ser algo onde um jogador convida o outro para formar um grupo para iniciar o trabalho e ambos receber um blip e marker aleatório no mapa e se um dos dois coletar o lixo, some para os dois.

Se alguém tem algum script parecido de formar grupo, ou sabe quais funções eu posso usar para fazer isso, ou tem uma sugestão para melhorar essa ideia, fico muito grato em receber sua resposta.

Script CLIENT

-- Painel
function showPanelGarbageman()
    local screenW, screenH = guiGetScreenSize()
        mainWindow = guiCreateWindow((screenW - 400) / 2, (screenH - 200) / 2, 400, 200, ". : LIXEIRO : .", false)
        guiWindowSetMovable(mainWindow, false)
        guiWindowSetSizable(mainWindow, false)
        guiSetProperty(mainWindow, "CaptionColour", "FFFFFF00")

        bAccept = guiCreateButton(10, 150, 110, 40, "ACEITAR", false, mainWindow)
        guiSetProperty(bAccept, "NormalTextColour", "FF02FF00")
        bCancel = guiCreateButton(280, 150, 110, 40, "CANCELAR", false, mainWindow)
        guiSetProperty(bCancel, "NormalTextColour", "FFFF0000")
        bDem = guiCreateButton(145, 150, 110, 40, "PEDIR DEMISSÃO", false, mainWindow)
        guiSetProperty(bDem, "NormalTextColour", "FF00FFFF")
        memo = guiCreateMemo(10, 27, 380, 113, "                                       Descrição\n\nVocê deve coletar os lixos espalhados pela cidade e trazer aqui para fazer a separação.", false, mainWindow)
        showCursor(not isCursorShowing())
end
addEvent( "showPanelGarbageman", true)
addEventHandler("showPanelGarbageman", root, showPanelGarbageman)

addEventHandler ("onClientGUIClick", guiRoot, function()
    if (source == bAccept) then
        guiSetVisible ( mainWindow, false )
        showCursor ( false )
        triggerServerEvent("startGarbageman", localPlayer)
    elseif (source == bCancel) then
        guiSetVisible ( mainWindow, false )
        showCursor ( false )
    elseif (source == bDem) then
        guiSetVisible ( mainWindow, false )
        showCursor ( false )
        triggerServerEvent("demGarbageman", localPlayer)
    end
end)

Script SERVER
 

-- Verifica se o jogador é um "lixeiro"
function isGarbageman(player)
	if getElementData(player, "Profissão") ~= "Lixeiro" then
		exports.dxmsgs:outputDx(player, "Veículo exclusivo para Lixeiros.", "error")
		cancelEvent()
	elseif getElementData(player, "Profissão") == "Lixeiro" then
		--Ainda não comecei essa parte....
	end
end

veh = {
	createVehicle(408, 2175.705, -1977.922, 13.553, 0, 0, 273.078, "STORM RP"),
	createVehicle(408, 2175.705, -1977.922 - 4, 13.553, 0, 0, 273.078, "STORM RP"),
	createVehicle(408, 2175.705, -1977.922 - 8, 13.553, 0, 0, 273.078, "STORM RP"),
}

-- Define o spawn dos veículos e chama a função isGarbageman
for i, v in ipairs(veh) do
	addEventHandler("onVehicleStartEnter", v, isGarbageman)
	local px, py, pz = getElementPosition(v)
	local rx, ry, rz = getElementRotation(v)
	setVehicleRespawnPosition(v, px, py, pz, rx, ry, rz)
end

function respawnVehicles()
    for i, v in ipairs(veh) do
        if not getVehicleOccupant(v, 0) then 
            respawnVehicle(v)
            setVehicleEngineState(v, false) 
            setVehicleOverrideLights(v, 1)
        end 
    end 
end
setTimer(respawnVehicles, 60000, 0)

--Local onde pega o trabalho
local jX, jY, jZ = 2200.718, -1970.048, 13.784
markerJob = createMarker(jX, jY, jZ - 0.8, "cylinder", 1, 0, 255, 0, 35)
createBlipAttachedTo(markerJob, 42, 2, 255, 255, 255, 255,  0, 350)
createObject (1210, jX, jY, jZ - 0.5, 1, 0, 90, true)

--Mostra o painel para o cliente
addEventHandler( "onPlayerMarkerHit", root,
	function (m)
		if m == markerJob and not isPedInVehicle(source) then
			triggerClientEvent(source, "showPanelGarbageman", source)
		end
	end
)

-- Quando o cliente aceita o trabalho
function startGarbageman()
	if client ~= source then return end

	if getElementData(source, "Profissão") ~= "Desempregado" then
		exports.dxmsgs:outputDx(source, "Você já está trabalhando! Sua profissão é: "..getElementData(source, "Profissão") , "error")
	elseif getElementData(source, "Profissão") == "Desempregado" then
		setElementData(source, "Profissão", "Lixeiro")
		exports.dxmsgs:outputDx(source, "Agora você é um Lixeiro!", "success")
	end
end
addEvent("startGarbageman", true)
addEventHandler("startGarbageman", root, startGarbageman)

-- Quando o cliente pede demissão
function demGarbageman()
	if client ~= source then return end

	if getElementData(source, "Profissão") == "Lixeiro" then
		setElementData(source, "Profissão", "Desempregado")
		exports.dxmsgs:outputDx(source, "Você foi demitido.", "success")
	elseif getElementData(source, "Profissão") ~= "Leixeiro" then
		exports.dxmsgs:outputDx(source, "Você não trabalha aqui, sua profissão é: "..getElementData(source, "Profissão"), "error")
	end
end
addEvent("demGarbageman", true)
addEventHandler("demGarbageman", root, demGarbageman)

--Onde começa a brincadeira...

NOTA: O GUI foi feito usando o guieditor, LORD HENRY Desculpa ainda não testei criar nada sem usar o guieditor kkkk 

Qualquer crítica ou sugestão é bem-vinda!

Link to comment
  • Other Languages Moderators
2 hours ago, Gaimo said:

NOTA: O GUI foi feito usando o guieditor, LORD HENRY Desculpa ainda não testei criar nada sem usar o guieditor kkkk 

Putz, que bosta hein.... Hahauahuahauah

Sobre a sua dúvida de colocar 2 jogadores juntos sem dar conflito com outras duplas, a minha sugestão é que vc coloque os dois dentro de uma table e essa table dentro de uma table global.

Exemplo marotamente maroto:

local globalLixeiros = {} -- Onde as duplas ficam, dentro de suas tables.

function criaDuplas (thePlayer, cmd, theDuplaName) -- Cria a table de cada dupla.
	if getPlayerFromPartialName (theDuplaName) and getPlayerFromPartialName (theDuplaName) ~= thePlayer then -- Se existe um jogador com o nick informado e esse jogador informado não é o mesmo que o jogador que executou o comando (evita fazer dupla com si mesmo), então:
		if getDupla (getPlayerFromPartialName (theDuplaName)) then -- Se o jogador que foi informado no comando já tem uma dupla, então:
			outputChatBox ("O jogador '"..theDuplaName.."' já está em uma dupla de lixeiros.", thePlayer, 255, 150, 0) -- Manda este aviso ao jogador que executou o comando.
		else -- Se o jogador informado não está em uma dupla de lixeiros ainda, então:
			local theDupla = {thePlayer, getPlayerFromPartialName (theDuplaName)} -- Cria a table da dupla, inserindo o jogador que executou o comando e o jogador que ele informou na mesma table dupla. 
			table.insert (globalLixeiros, theDupla) -- Insere a table theDupla na table globalLixeiros.
			outputChatBox ("Você colocou '"..theDuplaName.."' como sua dupla de lixeiro.", thePlayer) -- Manda este output ao cara que executou o comando.
		end
	end
end
addCommandHandler ("dupla", criaDuplas) -- Uso do comando: /dupla NickDoSeuAmigo

function getDupla (theLixeiro) -- Função que retorna a dupla do jogador informado.
	for i, dupla in ipairs (globalLixeiros) do -- Para cada dupla da table globalLixeiros, faça:
		if dupla[1] == theLixeiro then -- Se o jogador informado está como primeiro elemento desta dupla, então:
			return dupla[2] -- Retorna o segundo elemento desta dupla.
		elseif dupla[2] == theLixeiro then -- Se o jogador informado está como segundo elemento desta dupla, então:
			return dupla[1] -- Retorna o primeiro elemento desta dupla.
		end
	end
end

function qualquerCoisa (thePlayer, cmd) -- Função que manda um "Oi" para a dupla do jogador que usou o comando.
	if getDupla (thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		outputChatBox (getPlayerName(thePlayer).."#FFFFFF: Oi!", getDupla (thePlayer), 255, 255, 255, true) -- Manda esse outputChatBox pro outro player da dupla.
	end
end
addCommandHandler ("eae", qualquerCoisa)

function getPlayerFromPartialName(name) -- Função útil que pelo nome já sabe pra que serve.
	local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil
	if name then
		for _, player in ipairs(getElementsByType("player")) do
			local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower()
			if name_:find(name, 1, true) then
				return player
			end
		end
	end
end

A table deve ficar tipo isso:

local globalLixeiros = {
	{playerElement01, playerElement02}, -- Dupla 1.
	{playerElement04, playerElement07}, -- Dupla 2.
	{playerElement05, playerElement08}  -- Dupla 3.
}

 

Edited by Lord Henry
  • Thanks 2
Link to comment

Fiz algumas modificações mas agora estou um pouco confuso haha
Depois mais vou chamar alguém pra testar, ainda não testei com outro jogador...
 

Essa função aqui que me bugo um pouco:

function getDuo(theGarbageman) -- Função que retorna a dupla do jogador informado.
	for i, dupla in ipairs (tGarbageman) do -- Para cada dupla da table tGarbageman, faça:
		if dupla[1] == theGarbageman then -- Se o jogador informado está como primeiro elemento desta dupla, então:
			return dupla[2] -- Retorna o segundo elemento desta dupla.
		elseif dupla[2] == theGarbageman then -- Se o jogador informado está como segundo elemento desta dupla, então:
			return dupla[1] -- Retorna o primeiro elemento desta dupla.
		end
	end
end

Ele retorna o outro elemento da dupla, logo se eu usar o comando, ele vai retornar o nome do meu duo certo?

Então aqui:

function qualquerCoisa (thePlayer, cmd) -- Função que manda um "Oi" para a dupla do jogador que usou o comando.
	if getDupla (thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		outputChatBox (getPlayerName(thePlayer).."#FFFFFF: Oi!", getDupla (thePlayer), 255, 255, 255, true) -- Manda esse outputChatBox pro outro player da dupla.
	end
end
addCommandHandler ("eae", qualquerCoisa)

Se eu Gaimo estou em duo com o joaozinho33, e EU uso o comando "eae" vai sair isso?
joaozinho33: Oi!                  -- Essa mensagem vai para o joaozinho33

e se o joaozinho33 usar o comando vai sair?
Gaimo: Oi!                           -- Essa mensagem vai vir para mim??

KKKKKKK

Eu aproveitei essa função para fazer essa:

function msgDuo (thePlayer, cmd, msg) -- Função para a dupla conversar.
	if getDuo(thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		outputChatBox (getPlayerName(thePlayer)..": "..msg, getDuo(thePlayer), 255, 255, 255, true) -- Manda esse outputChatBox pro outro player da dupla.
	end
end
addCommandHandler ("mdupla", msgDuo)

Só não sei se funciona...... Pelo meu entendimento era pra funcionar kkkkkk

E como eu sei que o pessoal vai ZOAR .... BR É FODA......
Vai precisar de uma função para sair da dupla.
 

function exitDuo(thePlayer, cmd)
	if getDuo(thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		local theDuo = {thePlayer, }
		table.remove (tGarbageman, theDuo)
		outputChatBox(thePlayer, "Você saiu da dupla.")
	end
end
addCommandHandler("sdupla", exitDuo)

Foi fazendo ela que eu comecei a pensar.... EIii pera se retorna o outro elemento da dupla, vai tirar o meu duo e não eu...... 
Não terminei ela por que fiquei um pouco bugado kkkkk....
No caso a variável local theDuo = {thePlayer, "Faltou o segundo elelemento"}   Se o thePlayer vai ser meu duo, o que eu coloco no outro elemento?? KKKKKKKKKK


O Script inteiro ficou assim....

local tGarbageman = {} -- Onde as duplas ficam, dentro de suas tables.

function createDuo (thePlayer, cmd, theDuoName) -- Cria a table de cada dupla.
	if getElementData(thePlayer, "Profissão") == "Lixeiro" then -- Verifica se o jogador é um Lixeiro então:
		if getPlayerFromPartialName(theDuoName) and getPlayerFromPartialName(theDuoName) ~= thePlayer then -- Se existe um jogador com o nick informado e esse jogador informado não é o mesmo que o jogador que executou o comando (evita fazer dupla com si mesmo), então:
			if getDuo(getPlayerFromPartialName (theDuoName)) then -- Se o jogador que foi informado no comando já tem uma dupla, então:
				outputChatBox ("O jogador '"..theDuoName.."' já está em uma dupla de lixeiros.", thePlayer, 255, 150, 0) -- Manda este aviso ao jogador que executou o comando.
			else -- Se o jogador informado não está em uma dupla de lixeiros ainda, então:
				local theDuo = {thePlayer, getPlayerFromPartialName (theDuoName)} -- Cria a table da dupla, inserindo o jogador que executou o comando e o jogador que ele informou na mesma table dupla. 
				table.insert (tGarbageman, theDuo) -- Insere a table theDuo na table tGarbageman.
				outputChatBox ("Você colocou '"..theDuoName.."' como sua dupla de lixeiro.", thePlayer) -- Manda este output ao cara que executou o comando.
			end
		end
	end
end
addCommandHandler ("dupla", createDuo) -- Uso do comando: /dupla NickDoSeuAmigo

function exitDuo(thePlayer, cmd)
	if getDuo(thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		local theDuo = {thePlayer, }
		table.remove (tGarbageman, theDuo)
		outputChatBox(thePlayer, "Você saiu da dupla.")
	end
end
addCommandHandler("sdupla", exitDuo)

function msgDuo (thePlayer, cmd, msg) -- Função para a dupla conversar.
	if getDuo(thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		outputChatBox (getPlayerName(thePlayer)..": "..msg, getDuo(thePlayer), 255, 255, 255, true) -- Manda esse outputChatBox pro outro player da dupla.
	end
end
addCommandHandler ("mdupla", msgDuo)

function getDuo(theGarbageman) -- Função que retorna a dupla do jogador informado.
	for i, dupla in ipairs (tGarbageman) do -- Para cada dupla da table tGarbageman, faça:
		if dupla[1] == theGarbageman then -- Se o jogador informado está como primeiro elemento desta dupla, então:
			return dupla[2] -- Retorna o segundo elemento desta dupla.
		elseif dupla[2] == theGarbageman then -- Se o jogador informado está como segundo elemento desta dupla, então:
			return dupla[1] -- Retorna o primeiro elemento desta dupla.
		end
	end
end

function getPlayerFromPartialName(name) -- Função útil que pelo nome já sabe pra que serve.
	local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil
	if name then
		for _, player in ipairs(getElementsByType("player")) do
			local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower()
			if name_:find(name, 1, true) then
				return player
			end
		end
	end
end

Aprendendo a remover o cara da dupla acho que já estou apto a fazer também a função onPlayerQuit

 

Link to comment
  • Other Languages Moderators
1 hour ago, Gaimo said:

Se eu Gaimo estou em duo com o joaozinho33, e EU uso o comando "eae" vai sair isso?
joaozinho33: Oi!                  -- Essa mensagem vai para o joaozinho33

e se o joaozinho33 usar o comando vai sair?
Gaimo: Oi!                           -- Essa mensagem vai vir para mim??

Não. Vai sair isso:

Se vc usar o comando:
Gaimo: Oi!                -- Essa mensagem vai para o joaozinho33

 

Se joaozinho usar o comando:
joaozinho33: Oi!        -- Essa mensagem vai para o Gaimo.

Aquela sua função msgDuo não vai funcionar. Pois se a mensagem tiver espaço, não vai aparecer o resto.

Na sua função exitDuo, é mais fácil fazer um loop entre todas as duplas, quando encontrar uma dupla que o cara que executou o comando estiver dentro, remove essa dupla de dentro da table global. Desfazendo a dupla.

function exitDupla (thePlayer, cmd) -- Função que remove a si mesmo da dupla. Desfazendo-a.
	for i, dupla in ipairs (globalLixeiros) do -- Para cada dupla da table globalLixeiros, faça:
		if dupla[1] == thePlayer or dupla[2] == thePlayer then -- Se o jogador informado está nesta dupla, então:
			outputChatBox ("Sua dupla foi desfeita.", dupla[1]) -- Manda esse aviso pro primeiro cara da dupla.
			outputChatBox ("Sua dupla foi desfeita.", dupla[2]) -- Manda esse aviso pro segundo cara da dupla.
			table.remove (globalLixeiros, i) -- Remove a dupla que estiver na posição i da globalLixeiros, no caso a dupla que está sendo verificada agora.
			break -- Sai do loop, pois não precisa verificar o resto das duplas.
		end
	end
end
addCommandHandler ("sdupla", exitDupla)

 

Link to comment

AHHHHHH Agora eu entendi... Agora eu saquei.... Agora todas as peças se encaixaram..... Brincadeiras de lado...

 

function qualquerCoisa (thePlayer, cmd) -- Função que manda um "Oi" para a dupla do jogador que usou o comando.
	if getDupla (thePlayer) then -- Se o jogador que executou o comando tiver uma dupla, então:
		outputChatBox (getPlayerName(thePlayer).."#FFFFFF: Oi!", getDupla (thePlayer), 255, 255, 255, true) -- Manda esse outputChatBox pro outro player da dupla.
	end
end
addCommandHandler ("eae", qualquerCoisa)

Agora que eu entendi.....

outputChatBox( getPlayerName(thePlayer) aqui o the player ainda é o jogador que digitou.....  no getDupla(thePlayer) é para quem vai a mensagem.....

Quando eu olhei o
if getDupla(thePlayer) then -- Achei que a partir daqui o thePlayer passava a ser o duo... Mas nada a ver, é só uma verificação mesmo. Fui bem desatento.

Fácil de resolver o msgDuo kkkkkk só o pessoal usar ( _ )  Ola_parceiro_como_tu_tá....    Zoas vou tirar, não acho que vai ser necessário e se eu mudar de ideia vou deixar mais pro final do script.

Desde já agradeço sua ajuda ❤️

Agora novamente é comigo. MÃOS A OBRA

Link to comment
17 hours ago, OverKILL said:

Ta ficando TOP o trampo, parabéns, bem pensado xD.

Obrigado :D

Okay o script é mais complexo que eu imaginei que seria hahaha, pelo menos pra mim.
Acho que vou aposentar o projeto temporariamente, caso contrário vou acabar vindo todo instante pedir um pedaço do código por não saber como fazer.
 

Tipo agora não sei exatamente como criar um marker para a dupla pensei em algo assim:

routes = {
	{2382.10278, -1940.17554, 13.54688}
}

function createMarker(thePlayer, cmd)
	for i, dupla in ipairs (tGarbageman) do
		if not dupla.marker then
			local rndR = routes[ math.random( #routes ) ]
			createMarker(rndR[1], rndR[2], rndR[3], "cylinder", 1.5, 255, 255, 255, 255, dupla)



end

Ficaria assim? 

tGarbageman{
  {marker, jogador1, jogador2} 
}

Ou seria melhor criar um marker para cada jogador?
            createMarker(rndR[1], rndR[2], rndR[3], "cylinder", 1.5, 255, 255, 255, 255, dupla[1])
            createMarker(rndR[1], rndR[2], rndR[3], "cylinder", 1.5, 255, 255, 255, 255, dupla[2])


Então pra evitar ficar pedindo um pedaço do código a cada instante, vou começar bem pelo básico fazer scripts bem simples e ir aumentando sua complexidade aos poucos.

Link to comment
  • 1 year later...

Estou com um problema, depois de fazer a primeira rota, quando os jogadores vão repetir dobra, provavelmente o evento esta sendo criado duas vezes, como posso resolver?

Exemplo: 1 vez fazendo a rota envia uma única mensagem, na segunda vai enviar duas mensagens, e assim vai indo....

Server-side

teams = {}
routes = {
    -- A ROTA 1
    {
        {119.0534,-1600.7428,11.0364, {113.26455, -1603.06458, 10.01185}},
    },
    -- A ROTA 2
    {
        {-49.013, -1518.564, 1.82, {-52.439, -1522.7, 2.164}},
    },
}

veh = {}
-- Cria os veiculos e coloca na table veh
for i=1,6 do
    veh[createVehicle(408, -101.64936 + (5 * i), -1624.50, 4, 0,0,0, "ElitZone")] = true
end
-- Congela os veiculos da table veh
for i, _ in pairs(veh) do
    setElementFrozen(i, true)
    setVehicleDamageProof(i, true)
end

addEventHandler ( "onVehicleStartEnter", getRootElement(), function(player, seat)
    if veh[source] then --  Verifica se o veiculo pertence ao trabalho
        -- Verificar se o jogador atende os requisitos se nao cancelevent
    end
end)

addCommandHandler ("startlixo", function(thePlayer, cmd)
    local vehicle = getPedOccupiedVehicle(thePlayer)

    if veh[vehicle] then
        if getDuo(thePlayer) then
            if getDuo(thePlayer) == getVehicleOccupant(vehicle, 1) or getDuo(thePlayer) == getVehicleOccupant(vehicle, 0) then
                local temp = getDuoTable(thePlayer)
                if not teams[temp][3] then
                    teams[temp][3] = true
                    startJob(getVehicleOccupant(vehicle, 0), getVehicleOccupant(vehicle, 1), vehicle, temp)
                end
            else
                outputChatBox("O ocupante do seu veiculo nao eh seu duo.")
            end
            
        else
            outputChatBox("Voce precisa de uma dupla para este trabalho, digite: /duo NICKDOPLAYER")
        end
    else
        outputChatBox("Voce precisa estar dentro do veiculo de trabalho.")
    end
end)


function startJob(driver, collector, vehicle, duo)
    setElementFrozen(vehicle, false)
    setVehicleDamageProof(vehicle, false)

    outputChatBox("Siga até o marker para começar sua ROTA.", driver)
    -- Marker inicial
    start = createMarker(-45.42224, -1590.39478, 3.54895, "cylinder", 2, math.random(0, 255), math.random(0, 255), math.random(0, 255), 100, driver) 
    startBlip = createBlipAttachedTo(start, 0, 2, 255,255,255,255, 0,_,driver)

    addEventHandler( "onPlayerMarkerHit", root, function(marker)    
        -- Source do evento eh o Player
        if marker == start then
            if driver and collector then
                outputChatBox("Selecionando uma rota para voces.", driver)
                outputChatBox("Selecionando uma rota para voces.", collector)
                destroy(start)
                destroy(startBlip)
                randRot = routes[math.random(1, #routes)]
                driverMarker = createMarker(randRot[teams[duo][4]][1], randRot[teams[duo][4]][2], randRot[teams[duo][4]][3] -0.9, "cylinder", 5, 255, 255, 255, 255, driver)
                driverBlip = createBlipAttachedTo(driverMarker, 0, 2, 255,255,255,255, 0,_,driver)
            else
                outputChatBox("Seu companheiro nao esta no veiculo.")
            end                      
        elseif marker == driverMarker then -- Marker do motorista
            if driver and collector then
                --setElementFrozen(vehicle, true)
                destroy(driverMarker)
                destroy(driverBlip)
                collectorMarker = createMarker(randRot[teams[duo][4]][4][1], randRot[teams[duo][4]][4][2], randRot[teams[duo][4]][4][3] -0.9, "cylinder", 2, 255, 255, 255, 255, collector)
            end
        elseif marker == collectorMarker then -- Marker do coletor -  QUANDO ELE VAI PEGAR O LIXO
            destroy(collectorMarker)
            -- ACOES do coletor
            setPedAnimation(collector, "CARRY", "liftup", -1, false, false, false, false)
            setTimer(function()
                teams[duo][5] = createObject(1264, 0, 0, 0)
                setPedAnimation(collector,"CARRY","crry_prtial", 0, false, true, false)
                exports.bone_attach:attachElementToBone(teams[duo][5], collector, 11,-0.15,0.00,0.10,-92.00,-5.00,5.00)
            end, 1000, 1)
            outputChatBox("Leve o lixo até o caminhão", collector)
            vehMarker = createMarkerAttachedTo(vehicle, "cylinder", 2, 255,255,255,255, collector,_,-3.5,-1)
        
        elseif marker == vehMarker then -- Marker que fica atras do caminhao
            destroy(vehMarker)
            setPedAnimation( collector, "CARRY", "putdwn", -1, false, false, false, false )
            destroy(teams[duo][5])
            if teams[duo][4] == #randRot then
                -- FIM DO TRABALHO
                -- MANDE RETORNAR UM LUGAR
                outputChatBox('A rota acabou retorne para tal lugar', driver)
                endMarker = createMarker(-66.08349, -1587.34961, 3.11077, "cylinder", 2, 255,255,255,255,driver)
                endBlip = createBlipAttachedTo(endMarker, 0, 2, 255,255,255,255, 0,_,driver)
            else
                teams[duo][4] = teams[duo][4] + 1
                driverMarker = createMarker(randRot[teams[duo][4]][1], randRot[teams[duo][4]][2], randRot[teams[duo][4]][3] -0.9, "cylinder", 5, 255, 255, 255, 255, driver)
            end
        elseif marker == endMarker then
            if driver and collector then
                destroy(endMarker)
                destroy(endBlip)
                --paga o jogador
                teams[duo][3] = false
                teams[duo][4] = 1
                removePedFromVehicle(driver)
                removePedFromVehicle(collector)
                respawnVehicle(vehicle)
                setElementFrozen(vehicle, true)
                setVehicleEngineState(vehicle, false)
                setVehicleOverrideLights(vehicle, 1)
                setVehicleDamageProof(vehicle, false)
                outputChatBox('Trabalho escravo, voces nao vao receber nada.')
            end
        end
    end)
end

function createDuo (thePlayer, cmd, theDuoName) -- Cria a table de cada duo.
    if getPlayerFromPartialName (theDuoName) == thePlayer then
        return outputChatBox("Você não pode ser sua dupla.", thePlayer)
    end
	if getPlayerFromPartialName (theDuoName) then -- Se existe um jogador com o nick informado e esse jogador informado não é o mesmo que o jogador que executou o comando (evita fazer duo com si mesmo), então:
		if getDuo (getPlayerFromPartialName (theDuoName)) then -- Se o jogador que foi informado no comando já tem uma duo, então:
			outputChatBox ("O jogador '"..theDuoName.."' já está em uma duo de lixeiros.", thePlayer, 255, 150, 0) -- Manda este aviso ao jogador que executou o comando.
        else -- Se o jogador informado não está em uma duo de lixeiros ainda, então:
			local theDuo = {thePlayer, getPlayerFromPartialName (theDuoName), false, 1, "obj"} -- Cria a table da duo, inserindo o jogador que executou o comando e o jogador que ele informou na mesma table duo. 
            table.insert (teams, theDuo) -- Insere a table theDuo na table teams.
			outputChatBox ("Você colocou '"..theDuoName.."' como sua duo de lixeiro.", thePlayer) -- Manda este output ao cara que executou o comando.
        end
    else
        outputChatBox("O jogador não foi encontrado.", thePlayer)
	end
end
addCommandHandler ("duo", createDuo) -- Uso do comando: /duo NickDoSeuAmigo

function getDuo (player) -- Função que retorna a duo do jogador informado.
	for i, duo in ipairs (teams) do -- Para cada duo da table teams, faça:
        if duo[1] == player then -- Se o jogador informado está como primeiro elemento desta duo, então:
			return duo[2] -- Retorna o segundo elemento desta duo.
		elseif duo[2] == player then -- Se o jogador informado está como segundo elemento desta duo, então:
			return duo[1] -- Retorna o primeiro elemento desta duo.
		end
	end
end

function exitDuo (thePlayer, cmd) -- Função que remove a si mesmo da duo. Desfazendo-a.
	for i, duo in ipairs (teams) do -- Para cada duo da table teams, faça:
		if duo[1] == thePlayer or duo[2] == thePlayer then -- Se o jogador informado está nesta duo, então:
			outputChatBox ("Sua dupla foi desfeita.", duo[1]) -- Manda esse aviso pro primeiro cara da duo.
			outputChatBox ("Sua supla foi desfeita.", duo[2]) -- Manda esse aviso pro segundo cara da duo.
			table.remove (teams, i) -- Remove a duo que estiver na posição i da teams, no caso a duo que está sendo verificada agora.
			break -- Sai do loop, pois não precisa verificar o resto das duos.
		end
	end
end
addCommandHandler ("exitduo", exitDuo)


function getDuoTable(thePlayer)
    for i, duo in ipairs (teams) do -- Para cada duo da table teams, faça:
		if duo[1] == thePlayer or duo[2] == thePlayer then -- Se o jogador informado está nesta duo, então:
			return i
		end
	end
end

function getPlayerFromPartialName(name) -- Função útil que pelo nome já sabe pra que serve.
	local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil
	if name then
		for _, player in ipairs(getElementsByType("player")) do
			local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower()
			if name_:find(name, 1, true) then
				return player
			end
		end
	end
end

function destroy(element)
    if isElement(element) then
        destroyElement(element) 
    element = nil
    end
end

function createMarkerAttachedTo(element, mType, size, r, g, b, a, visibleTo, xOffset, yOffset, zOffset)
	mType, size, r, g, b, a, visibleTo, xOffset, yOffset, zOffset = mType or "checkpoint", size or 4, r or 0, g or 0, b or 255, a or 255, visibleTo or getRootElement(), xOffset or 0, yOffset or 0, zOffset or 0
	assert(isElement(element), "Bad argument @ 'createMarkerAttachedTo' [Expected element at argument 1, got " .. type(element) .. "]") assert(type(mType) == "string", "Bad argument @ 'createMarkerAttachedTo' [Expected string at argument 2, got " .. type(mType) .. "]") assert(type(size) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 3, got " .. type(size) .. "]") assert(type(r) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 4, got " .. type(r) .. "]")	assert(type(g) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 5, got " .. type(g) .. "]") assert(type(b) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 6, got " .. type(b) .. "]") assert(type(a) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 7, got " .. type(a) .. "]") assert(isElement(visibleTo), "Bad argument @ 'createMarkerAttachedTo' [Expected element at argument 8, got " .. type(visibleTo) .. "]") assert(type(xOffset) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 9, got " .. type(xOffset) .. "]") assert(type(yOffset) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 10, got " .. type(yOffset) .. "]") assert(type(zOffset) == "number", "Bad argument @ 'createMarkerAttachedTo' [Expected number at argument 11, got " .. type(zOffset) .. "]")
	local m = createMarker(0, 0, 0, mType, size, r, g, b, a, visibleTo)
	if m then if attachElements(m, element, xOffset, yOffset, zOffset) then return m end end return false
end

 

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...