-
Posts
3,984 -
Joined
-
Last visited
-
Days Won
181
Everything posted by Lord Henry
-
No primeiro erro, tente colocar veh6[client] no lugar de veh6. No segundo erro, faça a mesma coisa. Substitua o veh6 por veh6[client]
-
Veiculo andando sozinho [A até B] (Dúvida)
Lord Henry replied to #Gubiani's topic in Programação em Lua
No moveObject tem parâmetros pra rotacionar o objeto. Se o carro está anexado ao objeto, teoricamente deveria rotacionar junto com ele. -
Veiculo andando sozinho [A até B] (Dúvida)
Lord Henry replied to #Gubiani's topic in Programação em Lua
Não existe função nativa para fazer isso, mas como vc já deve imaginar, precisaria de um NPC dentro do ônibus para poder controlar a direção do ônibus. Você pode criar os pontos no mapa, que vão ser os markers de checagem. Ao colidir em um marker, verifica onde está o próximo marker (cada marker tem um ID na rota para ser seguida) e com base na posição desse próximo marker em relação a posição do ônibus, deve fazer o NPC dirigir para a direção correta. Mas atenção: Você precisará de um onClientRender para fazer o NPC parar de fazer a curva, quando o marker já estiver reto na sua frente. Portanto fazer um sistema desses, além de extremamente complexo, exigirá bastante processamento, mesmo que seja client-side. Você também precisará diferenciar os markers de parada, que com um setTimer, devem fazer o NPC parar o ônibus por um tempo e depois voltar a acelerar. Jogadores conseguem entrar de G no ônibus ocupado por um NPC, mas não podem roubá-lo. Certifique-se também de blindar o ônibus e deixar o NPC imortal, caso contrário o onClientRender floodará de erros tentando controlar um NPC morto. Ele não pediu nada relacionado a trens. Isso não resolve nem de perto o problema dele. -
Acho que não existe uma função nativa para isso. Pois precisaria de uma câmera para processar algo que está "vendo" ou não. E como todos nós sabemos, os Peds não possuem câmera, somente os jogadores. Mas é possível calcular algo assim com algumas gambiarras, obtendo a rotação e posição do Ped e fazendo vários cálculos com a posição do objeto para que ele seja considerado "visível pelo Ped". -------------------- Se o Ped estiver mirando em algo, você pode obter esse elemento com getPedTarget.
-
Não há problema em criar mais de um tópico no mesmo dia. Inclusive não há nada proibindo isso nas regras. No entanto, o ideal é que você conclua um tópico primeiro para depois criar outro. Então mano, como vc já deve saber. Pra salvar dados entre as sessões dos jogadores, é necessário salvá-las em um banco de dados. Mas pra isso você precisa saber que tipo de dado você está salvando. Se ele é uma data de uma conta de um jogador específico, ou se é uma data de um resource. Você precisa saber a diferença, pois cada uma delas é salva em um banco de dados diferente. A propósito. Seu código não está funcionando pois você está tentando obter um jogador que quitou. Então sempre dará erro. Além disso, se o seu servidor permitir que o jogador deslogue sem sair do servidor. Ele perderá dados, pois você não configurou pra salvar ao dar logout.
-
[DUVIDA] Deixa dxDrawRectangle selecionado
Lord Henry replied to +[T]rakin's topic in Programação em Lua
Bom, se você não tem conhecimento suficiente para mexer com DX, é melhor ir pro GUI que é mais simples. É como eu falei em outro tópico, o DX precisa ser todo feito na mão, enquanto que o GUI é só usar as funções prontas e mudar os parâmetros. O DX é mais complicado de entender. Quais partes ali do código de exemplo vc não entendeu? Quem sabe se eu explicar melhor, você consiga usar em DX. -
[DUVIDA] Deixa dxDrawRectangle selecionado
Lord Henry replied to +[T]rakin's topic in Programação em Lua
Use GUI em vez de DX e seja feliz. ----------------------- Tirando a zoeira, coloque os parâmetros do DX em variáveis e então você pode alterar essas propriedades da aparência do DX com uma função. E então você ativa essa função com onClientClick, verificando se a posição clicada está em cima do DX ou não. Exemplo maneiro: local sX, sY = guiGetScreenSize () -- Recebe a resolução do jogador. showCursor (true) -- Mostra o cursor. local parameters = { ["superior"] = {100, 100, 100, 150}, -- Cores RGBA. ["inferior"] = {0, 0, 0, 255}, ["esquerda"] = {100, 100, 100, 150}, ["direita"] = {0, 0, 0, 255}, ["texto"] = "OFF", } function renderDX () dxDrawRectangle (sX/2 - 50, sY/2 - 20, 100, 40, tocolor (0, 0, 0, 150), true) -- Botão de Áudio dxDrawLine (sX/2 - 50, sY/2 - 20, sX/2 + 50, sY/2 - 20, tocolor (unpack (parameters["superior"])), 2, true) -- Linha superior dxDrawLine (sX/2 - 50, sY/2 + 20, sX/2 + 50, sY/2 + 20, tocolor (unpack (parameters["inferior"])), 2, true) -- Linha inferior dxDrawLine (sX/2 - 50, sY/2 - 20, sX/2 - 50, sY/2 + 20, tocolor (unpack (parameters["esquerda"])), 2, true) -- Linha esquerda dxDrawLine (sX/2 + 50, sY/2 - 20, sX/2 + 50, sY/2 + 20, tocolor (unpack (parameters["direita"])), 2, true) -- Linha direita dxDrawText (parameters["texto"], sX/2 - 50, sY/2 - 20, sX/2 + 50, sY/2 + 20, tocolor (255, 255, 255, 255), 2.0, 2.0, "default", "center", "center", false, false, true) -- Texto botão de áudio dxDrawRectangle (sX/2 - 50, sY/2 + 30, 100, 40, tocolor (0, 0, 0, 150), true) -- Botão de Play (eu não quis colocar bordas nesse por preguiça) dxDrawText ("PLAY", sX/2 - 50, sY/2 + 30, sX/2 + 50, sY/2 + 70, tocolor (255, 255, 255, 255), 2.0, 2.0, "default", "center", "center", false, false, true) -- Texto botão de play. end addEventHandler ("onClientRender", getRootElement(), renderDX) function changeDX (button, state, absoluteX, absoluteY, worldX, worldY, worldZ, clickedWorld) if button ~= "left" then return end -- Se o botão do mouse clicado não for o esquerdo, então nada acontece. if state == "up" then -- Se o botão foi soltado, então: if (absoluteX >= sX/2 - 50) and (absoluteX <= sX/2 + 50) and (absoluteY >= sY/2 - 20) and (absoluteY <= sY/2 + 20) then -- Se a posição clicada está dentro do botão de áudio, então: if (parameters["texto"] == "OFF") then -- Se o texto do botão de áudio está como "OFF" então: parameters = { ["superior"] = {0, 0, 0, 255}, -- Altera os valores, pra mudar a aparência do botão. ["inferior"] = {100, 100, 100, 150}, ["esquerda"] = {0, 0, 0, 255}, ["direita"] = {100, 100, 100, 150}, ["texto"] = "ON", -- Muda o texto do botão de áudio pra "ON". } else -- Senão, se o botão de áudio está com outro texto que não seja "OFF", então: parameters = { ["superior"] = {100, 100, 100, 150}, -- Volta ao normal. ["inferior"] = {0, 0, 0, 255}, ["esquerda"] = {100, 100, 100, 150}, ["direita"] = {0, 0, 0, 255}, ["texto"] = "OFF", -- Muda o texto do botão de áudio pra "OFF". } end elseif (absoluteX >= sX/2 - 50) and (absoluteX <= sX/2 + 50) and (absoluteY >= sY/2 + 30) and (absoluteY <= sY/2 + 70) then -- Senão se a posição clicada está dentro do botão de play, então: if (parameters["texto"] == "ON") then -- Se o botão de áudio está habilitado, então: outputChatBox ("(Tocou a música.)") end -- Se o botão não está habilitado, então nada acontece. end end end addEventHandler ("onClientClick", getRootElement(), changeDX) -- Executa essa função quando o player clicar. -
Sempre deixe o /debugscript 3 ativado para ver se há erros.
-
Você pode colocar o timer em uma variável. E quando o jogador entrar no veículo, verificar se tem um timer dele. Se tiver, cancela esse timer. veh5 = {} timerVeh = {} function sair5 (thePlayer) -- Não use source como parâmetro de função. if source == veh5[thePlayer] then -- Se o veículo que o jogador saiu é o veh5 dele, então: if isTimer (timerVeh[source]) then -- Se esse veículo tem um timer de saída ativo, então: resetTimer (timerVeh[source]) -- Reinicia esse timer. else -- Se não tem um timer, então: timerVeh[source] = setTimer (function () -- Cria um timer, que irá destruir esse veículo depois de 5 segundos. destroyElement (source) veh5[thePlayer] = nil triggerClientEvent (thePlayer, "failPlayerLeave5", thePlayer) -- Ativa esse evento no client. end, 5000, 1) end end end addEventHandler ("onVehicleExit", getRootElement(), sair5) -- Executa essa função quando alguém sai de um veículo. function entrar5 (thePlayer) if isTimer (timerVeh[source]) then -- Se o veículo que o jogador entrou tem um timer, então: killTimer (timerVeh[source]) -- Cancela esse timer. end end addEventHandler ("onVehicleEnter", getRootElement(), entrar5) -- Executa essa função quando alguém entra em um veículo. (não testado)
-
Hum... Boa. Está evitando de adicionar o usuário que já está na ACL Group.
-
Teste aí e descubra
-
Sim, pois Se NÃO for uma conta guest, então faz o que deve ser feito. Se for Guest, não dará certo.
-
Dará erro na linha 2 (mas vc justificou, então blz) Erro na linha 3, pois você não pode usar uma função como nome de variável. Faça ao contrário. Além disso, você só pode obter o account name de uma conta e não direto do player. local conta = getAccountName(getPlayerAccount(source)) Na linha 4 é inútil verificar se a conta existe, pois ela sempre vai existir mesmo que o player esteja deslogado (Guest account). Em vez disso verifique se ela é uma conta Guest ou não usando isGuestAccount. if not (isGuestAccount (getPlayerAccount(source))) then -- Se a conta do jogador que usou o comando não for deslogado, então: O resto pode continuar assim.
-
Você quer que o usuário especifique a ACL no comando? Ou você quer que o script coloque em uma ACL já determinada?
-
Qual erro que está aparecendo? E cadê o meta.xml?
-
Está faltando a parte client-side que chama o evento PatenteROTA1. Mas vamos supor que ela esteja correta e que jogador exista. function PatenteROTA1 (jogador) local conta = getAccountName (getPlayerAccount (jogador)) if isGuestAccount (getPlayerAccount(jogador)) then outputChatBox ("[#ff8000Erro#000000]: #ff8000Jogador não está logado!", source, 0, 0, 0, true) return end if not isObjectInACLGroup ("user."..conta, aclGetGroup ("Coronel Rota")) then -- Havia um erro aqui, onde somente se o cara for comandante poderia receber a TAG de Coronel, o que não faz nenhum sentido. aclGroupAddObject (aclGetGroup("Coronel Rota"), "user."..conta) outputChatBox ("[#ff8000Aviso#000000]: #ffffffVocê Adicionou a tag 'Coronel Rota' Para: "..getPlayerName(jogador), source, 0, 0, 0, true) else outputChatBox ("[#ff8000Aviso#000000]: #ffffffJogador já está com essa tag.", source, 0, 0, 0, true) end end addEvent ("PatenteROTA1", true) addEventHandler ("PatenteROTA1", getRootElement(), PatenteROTA1)
-
[AJUDA] Obter dados de tabela em client/server-side
Lord Henry replied to Vazern's topic in Programação em Lua
De nada mano. Qualquer coisa estamos aqui. Não se esqueça de deixar um Thanks lá na resposta pra me ajudar. Abraço. -
Não dessa forma. thePed é uma variável que está guardando um elemento (ped) e não uma função. Faça dessa forma: function makePed () local thePed = createPed (infos) setPedAnimation (thePed, info) setTimer (setPedAnimation, 5000, 1, thePed, info) end
-
Daria pra usar getDistanceBetweenPoints3D, no entanto isso exige um onClientRender para ser preciso. Então no seu caso, é mais fácil criar um marker cilíndrico (createMarker), com um tamanho maior e totalmente transparente (invisivel), anexar ele no player com attachElements. E quando o policial colidir nesse marker, destruir esse marker e o blip do player. -------------------------- Mas antes disso vc deve resolver o problema do outputChatBox, que deve aparecer só pros policiais. function chat (thePlayer) local jogador = getPlayerName (thePlayer) -- Jogador = nome do player que executou o comando /190 local zona = getElementZoneName (thePlayer) -- zona = cidade e bairro onde thePlayer está. local todoMundo = getElementsByType ("player") -- todoMundo = tabela com todos os jogadores conectados no server. for i, policial in ipairs (todoMundo) do -- Para cada jogador do server, faça: if isObjectInACLGroup ("user."..getAccountName (getPlayerAccount (policial)), aclGetGroup ("ACLNAME")) then -- (Nome da ACL Group dos Policiais) Se o jogador está na ACL Group dos policiais, então: outputChatBox ("O jogador #8B0000"..jogador.." #FFFFFFestá precisando da policia em "..zona, policial, 255, 255, 255, true) -- Vai mandar isso somente pra quem for policial. end end outputChatBox ("Pedido de ajuda enviado aos policiais.", thePlayer, 255, 255, 0) -- Manda isso ao jogador que executou o comando /190. end addCommandHandler ("190", chat)
-
Destruir o blip quando um policial chegar perto do player que usou /190, é isso?
-
Sim, precisará de um loop, que passa por todos os jogadores e verifica quais deles são policiais. Se for policial, manda a mensagem pra ele. qth? O que é isso?
-
Primeiramente vamos ao que está errado no seu código. Por se tratar de um código server-side, está faltando parâmetros na sua função, como thePlayer. Que fica ali dentro do ( ). addCommandHandler é uma função que não possui source. Para obter o jogador que digitou o comando, você precisa obrigatoriamente declarar um parâmetro de função, como foi dito no item anterior. Por isso que nada dará certo a partir da segunda linha, pois source não existe. Você tem uma condição vazia em aberto e não chega a fechá-la. Se você pelo menos usasse o /debugscript 3, já teria percebido erros de sintaxe. No seu outputChatBox, você está declarando root como segundo argumento, isso significa que a mensagem está indo pra todo mundo, inclusive quem não é policial. Também há erros de indentação no seu código. Vou deixar o seu código do jeito que está, mas corrigido para ficar melhor de entender: function chat (thePlayer) local jogador = getPlayerName (thePlayer) local zona = getElementZoneName (thePlayer) outputChatBox ( "O jogador #8B0000"..jogador.." #FFFFFFestá precisando da policia em "..zona.."", getRootElement(), 255, 255, 255, true) -- Vai mandar isso pra todo mundo. end addCommandHandler ("190", chat) E @OverKILL, seus exemplos estão errados. No primeiro exemplo a mensagem está sendo enviada pra todo mundo, inclusive pra quem não é policial. No segundo exemplo não está sendo entregue aos policiais, só pro próprio jogador que executou o comando.
-
[AJUDA] Obter dados de tabela em client/server-side
Lord Henry replied to Vazern's topic in Programação em Lua
Coloque a tabela inteira numa variável e passe essa variável como argumento no triggerClientEvent. Então no client você poderá acessar esse argumento e obter a table. Exemplo maroto: Server-side: tabela = { [1] = "Elemento 1", [2] = "Elemento 2", [3] = "Elemento 3" } addCommandHandler ("eae", function (thePlayer, cmd) triggerClientEvent (thePlayer, "recebeTable", thePlayer, tabela) end) Client-side: addEvent ("recebeTable", true) addEventHandler ("recebeTable", getRootElement(), function (tabelaQualquer) outputChatBox ("Tabela recebida do server:") for i, valor in ipairs (tabelaQualquer) do outputChatBox (i.." = "..valor, 255, 255, 255) end end) (código não testado, avise se houver erros) Boa sorte. -
function entrar (source) if getElementType (source) == "player" and not getPedOccupiedVehicle (source) then -- Se o elemento que colidiu no marker for um player e ele estiver a pé, então: setElementPosition (source, 388.208984375, 173.7236328125, 1008.3828125) setElementInterior (source, 3) setElementDimension (source, 21) setElementRotation (source, 0, 0, 90) end end addEventHandler ("onMarkerHit", entrada, entrar)
-
Mostre a função.