Gaimo Posted February 13, 2019 Share Posted February 13, 2019 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 Lord Henry Posted February 13, 2019 Other Languages Moderators Share Posted February 13, 2019 (edited) 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 February 13, 2019 by Lord Henry 2 Link to comment
Gaimo Posted February 14, 2019 Author Share Posted February 14, 2019 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 Lord Henry Posted February 14, 2019 Other Languages Moderators Share Posted February 14, 2019 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
Gaimo Posted February 14, 2019 Author Share Posted February 14, 2019 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
Other Languages Moderators Lord Henry Posted February 14, 2019 Other Languages Moderators Share Posted February 14, 2019 Entendi a referência, Sr. Bender. Boa sorte ae e mãos a obra, quero dizer, mãos ao código. Link to comment
Jonas^ Posted February 15, 2019 Share Posted February 15, 2019 Ta ficando TOP o trampo, parabéns, bem pensado xD. Link to comment
Gaimo Posted February 15, 2019 Author Share Posted February 15, 2019 17 hours ago, OverKILL said: Ta ficando TOP o trampo, parabéns, bem pensado xD. Obrigado 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
Other Languages Moderators Lord Henry Posted February 15, 2019 Other Languages Moderators Share Posted February 15, 2019 (edited) Crie o marker client-side. Mas em vez de mandar o triggerClientEvent pra só 1 cara, mande para a table da dupla. Edited February 15, 2019 by Lord Henry Link to comment
Gaimo Posted May 17, 2020 Author Share Posted May 17, 2020 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
Other Languages Moderators Lord Henry Posted May 18, 2020 Other Languages Moderators Share Posted May 18, 2020 Já tentou usar isso? IsEventHandlerAdded Link to comment
HiroShi Posted May 23, 2020 Share Posted May 23, 2020 cabeça doeu kk, mais acabei entendendo tudo Link to comment
matheus11111 Posted May 24, 2020 Share Posted May 24, 2020 Um sistema desse seria interessante com emprego de Carro forte . Link to comment
Other Languages Moderators Lord Henry Posted May 24, 2020 Other Languages Moderators Share Posted May 24, 2020 @matheus11111 não reviva tópicos antigos. Link to comment
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now