-
Posts
3,875 -
Joined
-
Days Won
67
Everything posted by DNL291
-
Repetindo o que falei no meu post acima, tudo vai precisar ser configurado pra funcionar individualmente já que o código é server-side, e no caso da variável 'i' e 'Trabalho' isso vai gerar erros quando outros jogadores fazerem a mesma coisa. Vale também pros elementos marker e blip que vão precisar ser ocultados e mostrados constantemente.
-
Isso já não foi resolvido aqui (?): Ou você tá falando de outra coisa?
-
Só pra complementar o código e evitar spam, você poderia adicionar o jogador numa tabela global dos jogadores que já chamaram o "Uber" e evitar com uma verificação que o jogador dê spam com uma bind, como por exemplo: /bind m uber.
-
[DUVIDA] Deixa dxDrawRectangle selecionado
DNL291 replied to +[T]rakin's topic in Programação em Lua
Seria melhor se você explicasse o que você quer fazer, então poderíamos te mostrar a melhor forma de fazer. Tem GUI como já foi falado e é mais fácil de fazer em comparação ao DX, mas se você optar mesmo pelo DX, então estude os códigos que foi mostrado aqui (além disso tem outros aqui pelo fórum) e boa sorte. -
O que está de errado que o código não funciona? Não espere que alguém pegue seu código, teste e te dê corrigido. Pelo que eu vejo no seu código, tem variáveis que serão compartilhadas em todos jogadores por estarem no lado server.
-
Esse código é seu ou ele é público? Apenas para evitar problemas, é recomendado que evite postar códigos privados aqui no fórum, se não for privado sem problemas.
-
Só colocar um ')' na linha 12 do código do asrzk.
-
Não testei mas acho que dá certo sim, só você testar e ver createBlipAttachedTo getElementsByType -- loop em todos jogadores isObjectInACLGroup -- verificar se é uber setElementVisibleTo Edit: e quando alguém entrar na ACL, você vai precisar atualizar o jogador para que ele possa visualizar os blips dos colegas.
-
Tente o seguinte: function trab ( playerSource ) if isElementWithinMarker(marker) then -- vou adicionar o marker ainda local account = isGuestAccount(getPlayerAccount(playerSource)) and false or getPlayerAccount(playerSource) -- se for uma conta "guest" a variável retornará false if account then if isObjectInACLGroup( "user."..getAccountName(account), aclGetGroup( "UBER" ) ) then return outputChatBox("Você já está neste trabalho!", playerSource, 230, 0, 0) -- o jogador já tá nesse grupo, então manda a msg de aviso end if aclGroupAddObject (aclGetGroup("UBER"), "user. "..getAccountName(account)) then outputChatBox ("✘ #838B83Uber Brasil #FFFFFF✘ - Você agora está trabalhando de Uber, espere até aparecer um chamado", playerSource, 255, 255, 255, true) -- faz a checagem verificando se a conta foi adicionada, então envia a mensagem no chat end end else outputChatBox ("✘ #838B83Uber Brasil #FFFFFF✘ - #ff0000Você não está no local correto para pegar o trabalho", playerSource, 255, 255, 255, true) end end addCommandHandler ("trab2", trab)
-
@danblemes1 Sempre que postar algo que não seja da linguagem inglesa, poste do subfórum Other Languages, no caso deve ser no sub-fórum Portuguese / Português > Programação em Lua Sobre a sua pergunta, é só usar setTimer chamando a função (no caso "trab2") dentro da primeira função, exemplo: mk1 = createMarker (x, y, z, "cylinder", 1.5, 255, 255, 255, 255) mk2 = createMarker (x, y, z, "cylinder", 1.5, 255, 255, 255, 255) function trab () --função que vou desenvolver setTimer(trab2, 5000, 1) end addEventHandler ("onMarkerHit", mk1, trab) function trab2 () --Quero que essa função seja executada 5 minutos dps da primeira função end
-
function fim3 (hitElement) if (hitElement == getElementData (source, "owner")) then -- Se o elemento que colidiu for o dono do marker, então: if veh[hitElement] and isElement(veh[hitElement]) then -- Se existe o veículo do trampo do jogador, então: if (getElementData (source, "trip") < #destinos) then -- Se a data do marker é menor que a quantidade de destinos, então: (indicando que não é a última viagem) dxMsg(hitElement, "Entregando as Pizzas, Aguarde...", "info") setTimer(function( hitElement, marker ) local x, y, z = unpack (destinos[getElementData (marker, "trip") + 1]) -- x, y, z recebem a próxima coordenada da table destinos. setElementPosition (marker, x, y, z) -- Coloca o marker de objetivo nessa nova coordenada. setElementData (marker, "trip", getElementData (marker, "trip") + 1) -- Seta a nova viagem nesse marker. outputChatBox ("Você entregou as Pizzas no destino. Siga para o próximo. ("..getElementData (marker, "trip").."/"..#destinos..")", hitElement) -- Avisa o jogador quantas viagens ele fez e quantas são no total, pra ele não pensar que está trabalhando de graça. end, 5000, 1, hitElement, source) else -- Se o marker de objetivo colidido não tem data menor que a quantidade de viagens, então: (indicando que esse é o último objetivo) dxMsg(hitElement, "Recebendo Pagamento Agurde...", "info") setTimer(function(hitElement) removeEventHandler ("onMarkerHit", Mfim3[hitElement], fim3) -- Remove o evento que ativa este marker, pois ele não será mais usado. destroyElement (veh[hitElement]) -- Destroi o veículo do trampo do jogador. givePlayerMoney (hitElement, 2000) -- Dá o dinheiro do trampo. if isElement(Bfim3[hitElement]) then destroyElement (Bfim3[hitElement]) end -- Destroi o blip anexado ao marker de objetivo. Bfim3[hitElement] = nil if isElement(Mfim3[hitElement]) then destroyElement (Mfim3[hitElement]) end -- Destroi o marker de objetivo. Mfim3[hitElement] = nil dxMsg(hitElement, "Pagamento recebido campeão (R$ 2000)!", "sucess") -- Avisa o jogador que ele completou o trampo. end, 5000, 1,hitElement) end end end end Tente isso.
-
If I am not wrong, use this function: toggleControl with "sprint" in the control argument.
-
Primeiro, a tabela, crie uma tabela com o nível no índice e a exp para upar o nível no valor. Exemplo: local levelsTable = { [1] = 500, --nível 1 -> exp necessária 500 [2] = 900, --1 [3] = 1100, --2 [4] = 1300 --3 } Isso será útil para a função que faz a checagem de quando o nível sobe. Ambos, o nível do jogador e a exp você vai deixar armazenados com setElementData e na função que vai dar exp você seta o valor no element-data e chama a função que verifica se o jogador subiu de nível - essa função vou falar dela mais pra frente A função que dá exp: local level_maximo = 50 -- aqui fica definido o último level function givePlayerExp( exp ) if exp and tonumber(exp) and (getElementData( localPlayer, "level" ) or 0) ~= level_maximo then -- "(getElementData( localPlayer, "level" ) or 0) ~= level_maximo" basicamente isso será para a função, -- ser executada só se o level for diferente do último level local playerExp = getElementData( localPlayer, "playerExp" ) or 0 -- pega a exp atual; se falhar o valor será 0 setElementData( localPlayer, "playerExp", playerExp + tonumber(exp) ) -- define a exp somando a atual + a exp ganha checkLevel( localPlayer ) -- aqui é a função que verifica se o jogador já atingiu a exp necessária return true end return false end Em seguida vem a parte mais difícil, ou mais complexa - a função que vai checar quando upar o nível. Leia os comentários no código para entender como funciona: function checkLevel( player ) local player = player or localPlayer local playerExp = getElementData( player, "playerExp" ) or 0 local lv = getElementData( player, "level" ) or 0 -- pega o level do jogador local expCheck = levelsTable[lv] - playerExp --[[ aqui em "levelsTable[lv]" recebe a exp pra subir nível sendo que "lv" representa o level, poderia ser por exemplo, 900, que é o valor pra subir pro level 3. "playerExp" é a exp atual do jogador, suponhamos que seu level é 2, e com a exp ganha sua exp passa a ser 1000, então será a variável "expCheck" retornará o valor -100 (900 - 1000) ]]-- if expCheck <= 0 then -- se "expCheck" for negativo ou igual a zero, então o lv subiu local exp = (lv + 1) == level_maximo and 0 or playerExp - levelsTable[lv] --[[ seguindo a suposição feita acima, aqui vai setar a nova exp com aqueles -100 restantes sendo aproveitados. Então será definido a exp como 100 Em "(lv + 1) == level_maximo and 0" está verificando se o novo level é o último, caso seja, a exp para upar será sempre 0 ]] setElementData( player, "level", lv + 1 ) -- aqui seta o novo level; level atual + 1 setElementData( player, "playerExp", exp ) -- seta a nova exp do jogador end end Outra coisa necessária será o evento "onClientElementDataChange", esse será para detectar uma alteração direta no element-data: addEventHandler( "onClientElementDataChange", root, function (dataName) if (dataName == "playerExp") then checkLevel( source ) -- chama a função para verificar se o level subiu end end ) Feito isso, o resto fica bem fácil, como o que você citou que é dar exp ao jogador a cada x tempo. Aqui um exemplo simples: setTimer( function() givePlayerExp( 10 ) -- dá 10 pontos de exp end, 60000 * 10, 0 -- 60000 * 10 -> 10 minutos ) Pra salvar na conta, use a função mencionada pelo LordHenry e os eventos onPlayerQuit e onPlayerLogout; E para carregar os dados use onPlayerLogin + getAccountData + setAccountData. Finalizando, o código ficará assim: local level_maximo = 50 -- aqui fica definido o último level local levelsTable = { [1] = 500, --nível 1 -> exp necessária 500 [2] = 900, --1 [3] = 1100, --2 [4] = 1300 --3 } function checkLevel( player ) local player = player or localPlayer local playerExp = getElementData( player, "playerExp" ) or 0 local lv = getElementData( player, "level" ) or 1 -- pega o level do jogador local expCheck = levelsTable[lv] - playerExp --[[ aqui em "levelsTable[lv]" recebe a exp pra subir nível sendo que "lv" representa o level, poderia ser por exemplo, 900, que é o valor pra subir pro level 3. "playerExp" é a exp atual do jogador, suponhamos que seu level é 2, e com a exp ganha sua exp passa a ser 1000, então será a variável "expCheck" retornará o valor -100 (900 - 1000) ]]-- if expCheck <= 0 then -- se "expCheck" for negativo ou igual a zero, então o lv subiu local exp = (lv + 1) == level_maximo and 0 or playerExp - levelsTable[lv] --[[ seguindo a suposição feita acima, aqui vai setar a nova exp com aqueles -100 restantes sendo aproveitados. Então será definido a exp como 100 Em "(lv + 1) == level_maximo and 0" está verificando se o novo level é o último, caso seja, a exp para upar será sempre 0 ]] setElementData( player, "level", lv + 1 ) -- aqui seta o novo level; level atual + 1 setElementData( player, "playerExp", exp ) -- seta a nova exp do jogador end end function givePlayerExp( exp ) if exp and tonumber(exp) and (getElementData( localPlayer, "level" ) or 0) ~= level_maximo then local playerExp = getElementData( localPlayer, "playerExp" ) or 0 -- pega a exp atual; se falhar o valor será 0 setElementData( localPlayer, "playerExp", playerExp + tonumber(exp) ) -- define a exp somando a atual + a exp ganha checkLevel( localPlayer ) -- aqui é a função que verifica se o jogador já atingiu a exp necessária return true end return false end addEventHandler( "onClientElementDataChange", root, function (dataName) if (dataName == "playerExp") then checkLevel( source ) -- chama a função para verificar se o level subiu end end ) setTimer( function() givePlayerExp( 10 ) -- dá 10 pontos de exp end, 60000 * 10, 0 -- 60000 * 10 -> 10 minutos )
-
Verdade. Por algum motivo eu pensei que o jogador poderia continuar na tabela sem estar no emprego e sair do jogo, mas o script já remove ele quando sai do emprego.
-
Foi o que eu quis dizer, ela vai setar o max_slots no veículo que explodir. Você disse que alguns veículos spawnam com os slots, então pode ser que os outros tenham respawnado por estarem na água - vi que tem um timer que verifica isso, e respawna se tiver na água sem setar o max_slots. Se não for isso, como eu disse, deve ser algum bug no seu código. Use o comando /debugscript 3 e veja se mostra alguma mensagem de erro.
-
Esse código vai executar pra qualquer player não vai? Precisa de uma verificação pra saber se a pessoa está no emprego.
-
Isso. é uma tabela global do DayZ, assim como a tabela "vehicleSpawns". Falando em alterar as coisas Lukkas2201, acho melhor você nunca fazer isso a menos que saiba o que tá fazendo, o GM é complexo e quem não programa Lua só vai bugar ele. Sobre os slots, eu vi aqui que no código do onVehicleExplode tem essa linha: setTimer(respawnDayZVehicle,1800000,1,id,x,y,z,source,col,getElementData(col,"MAX_Slots")) Então pelo certo ali vai setar os slots do veículo explodido. Só não sei te dizer se é mesmo esse valor, pelo visto é. Pode ser que algum erro no script tenha gerado esse problema, ou isso já veio no GM. Não sei pois nunca tive um server DayZ.
-
Eu sinceramente não entendi o porquê deixar o blip invisível, ocultar os elementos de outros jogadores não vai ser necessário, como eu já disse. É por isso mesmo que nesses tipos de scripts você deve criar o(s) elemento(s) que devem mostrar ao jogador local no lado client. O script tá feito de uma forma meio bagunçada, mas vamos lá: Você quer que remova o blip vinculado ao marker, basta usar destroyElement( marker ) usando a variável da marker correspondente. Exemplo: cardrivepoints = cardrivepoints+1 destroyElement (markerElement1) destroyElement(markerFim1) if cardrivepoints >= 1 then triggerServerEvent ("completedMissionCollect", localPlayer) end
-
Alguns erros no lado client: Você tá usando uma função que é server-side ("setElementVisibleTo") e além disso não é necessário fazer isso no client, visto que tudo executa só para o jogador local. outputChatBox está recebendo um argumento "source" sendo que no client não é necessário; todas outputs no client funciona só para o jogador local. O valor "client" é usado no lado server, isso serve para a validação do jogador local. Use localPlayer. Edit: no caso ali deve ser o parâmetro hitPlayer, que foi definido como "source" Sobre a detecção do veículo, só fazer o que já foi dito - enviar o elemento no evento "mission5"
-
Foi bem genérica na verdade. Então, o problema estava lá no sistema de backup que altera a posição de spawn quando salva os veículos (na verdade isso não é um erro do script, já foi feito pra respawnar na posição que estava mas o @Lukkas2201 pelo jeito não quer isso). Veja que tem um comando chamado svp que spawna todos veículos na posição de origem (que está na tabela vehicleSpawns), enfim, não sei se o OP tinha conhecimento dele.
-
I understood your question wrong, sorry. For PhpStorm I don't know any MTA plugins, although they exist for Lua.
-
Eu nem ligo em ajudar por privado, mas as coisas tem um limite. Desculpem a mensagem fora do assunto aqui, mas a propósito queria falar uma coisa, no caso pra você Lord. Percebi que você tem vários posts bem elaborados (como o do loop/ipairs/pairs), você poderia postar mais na seção Tutoriais, seria bem útil pra mais pessoas encontrarem e além do mais é mais "tutorial" do que alguns posts de lá...
-
Sim, a tabela 'veh' também estava armazenando o elemento player. Meu último código tem um 'end' extra na linha 8, remova ele.
-
Enfim, teve várias coisas ali no meu post que você não deve ter entendido; Tente isto: function sair4 () if isElement(Bfim4[source]) then destroyElement (Bfim4[source]) end if isElement(Mfim4[source]) then destroyElement (Mfim4[source]) end if isElement(veh[source]) then destroyElement(veh[source]) end Bfim4[source] = nil Mfim4[source] = nil veh[source] = nil end end addEventHandler("onPlayerQuit", getRootElement(), sair4)
-
Você só trocou thePlayer por source, mas não é isso que tá no meu comentário acima.