Jump to content

n3wage

Members
  • Posts

    290
  • Joined

  • Last visited

Everything posted by n3wage

  1. Solução usando diferentes dimensões para cada marker: Boxs = { Positions = { {1368.09497, -1279.76941, 13.54688 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4}, {2333.50806, 61.62383, 26.70579 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4}, {-2625.85010, 208.34500, 4.81250 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4}, {2158.97290, 943.12683, 10.82031 + 0.8, 285.67160, -86.19171, 1001.52289 + 0.8, 294.71225, -80.24703, 1001.51563 - 0.8, 4} }, Data = {} } addEventHandler("onResourceStart", resourceRoot, function () for i = 1, #Boxs.Positions do local enter = createMarker(Boxs.Positions[i][1], Boxs.Positions[i][2], Boxs.Positions[i][3], "arrow", 1, 255, 255, 0, 255); local exit = createMarker(Boxs.Positions[i][4], Boxs.Positions[i][5], Boxs.Positions[i][6], "arrow", 1, 255, 255, 0, 255); local marker = createMarker(Boxs.Positions[i][7], Boxs.Positions[i][8], Boxs.Positions[i][9], "cylinder", 1, 255, 255, 0, 255); createBlipAttachedTo( enter, 6, 2, 0, 255, 0, 0, 0, 7000 ); setElementInterior( exit, Boxs.Positions[i][10] ); setElementInterior( marker, Boxs.Positions[i][10] ); setElementDimension( exit, i ); setElementDimension( marker, i ); Boxs.Data[ enter ] = { type = "enter", id = i }; Boxs.Data[ exit ] = { type = "exit", id = i }; Boxs.Data[ marker ] = { type = "marker", id = i }; end end ) addEventHandler("onMarkerHit", resourceRoot, function (Jog, mathDim) if ( getElementType(Jog) == "player" and mathDim and Boxs.Data[ source ] ) then if ( Boxs.Data[ source ]["type"] == "enter" ) then local x, y, z = getElementPosition(Jog); local id = Boxs.Data[ source ]["id"]; fadeCamera(Jog, false, 1.0); setTimer( function (Jog) fadeCamera(Jog, true, 1.0); setElementDimension ( Jog, id ); setElementInterior(Jog, Boxs.Positions[ id ][10], Boxs.Positions[ id ][4]+1.5, Boxs.Positions[ id ][5]+1.5, Boxs.Positions[ id ][6]); end , 2000, 1, Jog) elseif ( Boxs.Data[ source ]["type"] == "exit" ) then local id = Boxs.Data[ source ]["id"]; fadeCamera(Jog, false, 1.0); setTimer( function (Jog) fadeCamera(Jog, true, 1.0); setElementDimension ( Jog, 0 ); setElementInterior(Jog, 0, Boxs.Positions[ id ][1]+1.5, Boxs.Positions[ id ][2], Boxs.Positions[ id ][3]); end , 2000, 1, Jog) elseif ( Boxs.Data[ source ]["type"] == "marker") then triggerClientEvent(Jog, getResourceName(getThisResource())..": onClientSystem", root, "addRenderScript"); end end end )
  2. Só para complementar, Isso ocorre porque a linguagem pega apenas o primeiro argumento passado de funções executadas dentro de outras funções. Ou seja, Nessa linha: Boxs.Marker.Create[2] = createMarker(unpack(Boxs.Marker.Positions[math.random(1, #Boxs.Marker.Positions)]), "cylinder", 1, 255, 0, 0, 255); A linguagem só vai pegar o primeiro argumento retornado da função unpack, Assim ficando: Boxs.Marker.Create[2] = createMarker(POSICAO_X, "cylinder", 1, 255, 0, 0, 255); Por isso o erro ocorre, A solução é fazer como o DNL fez, criar variáveis com os valores retornados pela função unpack e depois usar essas variáveis na função createMarker.
  3. Tenha certeza que você adicionou uma coluna na gridlist (guiGridListAddColumn). Use guiGridListAddRow em vez de guiGridListGetSelectedItem na linha 11. Ah, Também lembre de fechar o arquivo xml depois de adicionar os itens na gridlist.
  4. Honestly this isn't going to work, If you have basic knowledge of how things work you can break this "protection" with 1 line of code.
  5. @FelipeMallmann Esse seu ultimo código não vai funcionar porque você redefiniu a variavel carro como sendo parâmetro da função do timer, Assim ela vira nil já que você não passou nenhum parâmetro, Para seu "método" ter funcionado você teria que ter feito da seguinte maneira: local carro = source setTimer( function () -- ... Sem usar parâmetros na função, Mas tem uma maneira melhor, Você pode passar os parâmetros que quiser no setTimer que eles serão passados para a função: setTimer ( function( carro ) -- ... end , 5000, 1, source ); Assim você passará a variável source (que é o veiculo que explodiu) para a função do timer. -- btw outra coisa que vocês estão fazendo errado é usar sourcePlayer (Variável não definida) nos outputChatBoxes, Usando essa "variável" (nil) Vocês estarão mandando a mensagem para todos os jogadores.
  6. Tente: local subornos = {}; function subornarpolicial ( thePlayer, _, nick, amount ) if ( nick and amount ) then if ( getPlayerMoney ( thePlayer ) >= ( tonumber ( amount ) or math.huge ) ) then local target = getPlayerFromPartialName ( nick ); if ( target ) then if ( getElementData( thePlayer, "algemado" ) or getElementData( thePlayer, "navtr" ) ) then subornos[ target ] = { thePlayer, tonumber( amount ) }; outputChatBox("#000000[#ff0000POLICIA#000000] #c1c1c1O Jogador algemado lhe ofereceu $" .. amount .. " para você liberar ele, digite /aceitarsuborno para aceitar ou /recusarsuborno para recusar.", target, 255, 255, 255, true ); else outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Você precisa estar preso ou algemado para executar este comando!", thePlayer, 255, 255, 255, true ); end else outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Nenhum jogador encontrado com este nome!", thePlayer, 255, 255, 255, true ); end else outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Você não tem dinheiro suficiente!", thePlayer, 255, 255, 255, true ); end else outputChatBox( "#000000[#ff0000POLICIA#000000] #c1c1c1Comando correto: /suborno nick_do_policial total_de_dinheiro!", thePlayer, 255, 255, 255, true ); end end addCommandHandler ( "suborno", subornarpolicial ); function aceitar_suborno( thePlayer ) if ( subornos[thePlayer] ) then local subornoInfo = subornos[thePlayer]; takePlayerMoney ( subornoInfo[1], subornoInfo[2] ); outputChatBox ( "O policial aceitou seu suborno ! Você perdeu $" .. subornoInfo[2], subornoInfo[1], 0, 255, 0 ); subornos[ thePlayer ] = nil; else -- ninguem esta subornando o jogador. end end addCommandHandler( "aceitarsuborno", aceitar_suborno );
  7. Não tem necessidade nenhuma em usar element data, Você pode fazer da seguinte maneira (Obviamente você vai precisar trocar as variáveis, checar se o jogador que ofereceu o suborno ainda esta online etc): No topo do script: subornos = {}; No comando de oferecer suborno: subornos[ jogador que vai ser subornado ] = { jogador que esta oferecendo o suborno, quantia }; No comando de aceitar o suborno: if subornos[ jogador que vai aceitar o suborno ] then local subornoInfo = subornos[ jogador que vai aceitar o suborno ]; takePlayerMoney ( subornoInfo[1], subornoInfo[2] ); outputChatBox ( "O policial aceitou seu suborno ! Você perdeu $" .. subornoInfo[2], subornoInfo[1], 0, 255, 0 ); subornos[ jogador que vai aceitar o suborno ] = nil; else -- ninguem esta subornando o jogador. end
  8. function PedirReforcos ( thePlayer ) local location = getZoneName ( getElementPosition ( thePlayer ) ); for i, player in pairs ( getElementsByType ( "player" ) ) do if ( isObjectInACLGroup ( "user." .. getAccountName ( getPlayerAccount ( player ) ), aclGetGroup ( "ComandosPolicia" ) ) ) then local x, y, z = getElementPosition ( player ); local distancia = getDistanceBetweenPoints3D ( x, y, z, getElementPosition ( thePlayer ) ); outputChatBox ( "#000000[#ff0000POLICIA#000000] #c1c1c1O jogador " .. getPlayerName ( thePlayer ) .. " pediu reforços mais proximo de " .. location .." a ".. math.floor(distancia) .." Km/H.", player, 255, 255, 255, true ) end end end addCommandHandler( "reforcos", PedirReforcos );
  9. Sim, é exatamente assim, Claro que pode ser aprimorado para salvar outros dados também, Mas como uma base funciona. Já que você precisa passar a conta no primeiro argumento da função setAccountData você pode fazer um loop de todas as contas usando a função getAccounts.
  10. Isso fica a sua escolha, Eu usaria as funções db* para poder trabalhar com MySQL támbem (Fora que acho mais organizado cada resource/gamemode ter seu database), Você também pode usar account datas (Que também são salvas na internal.db). Exatamente, Quando o jogador se logar você carrega todos os dados e quando ele sair você obtêm eles usando getElementData ou getAllElementData e salva no database. Você também pode ir salvando de tempos em tempos para ter uma segurança a mais se quiser.
  11. Você "escolhe" a função quando adiciona o evento: addEventHandler ("limparchat", root, abrirchat) Se ao invés de abrirchat tivéssemos outra função ali essa outra função que iria receber os parâmetros (Também podemos fazer duas (ou mais) funções receberem os parâmetros (usando outra vez a função addEventHandler)).
  12. nick_de_quem_limpou vai ser o nick do jogador que limpou o chat, Porem essa variavel só existe na função abrirchat (porque passamos ela via triggerClientEvent) então definimos a variavel global name como sendo igual a variavel nick_de_quem_limpou, Assim teremos o nick fora da função abrirchat, e ai podemos usar ele no dxDrawText. function dxchat() dxDrawRectangle(168, 203, 600, 62, tocolor(0, 0, 0, 109), false) dxDrawBorderedText(""..name.." Limpou o Chat", posone, 215, 197, 383, tocolor(255, 255, 255, textAlpha),1.00, font) end function abrirchat(nick_de_quem_limpou) name = nick_de_quem_limpou; addEventHandler ("onClientRender", root, dxchat) setTimer(function() removeEventHandler ("onClientRender", root, dxchat) end, 4000, 1 ) end addEvent ("limparchat", true) addEventHandler ("limparchat", root, abrirchat)
  13. Basta você passar o nick (ou o jogador) como argumento na função triggerClientEvent, Assim você terá o nick de quem limpou o chat no lado do cliente. -- server triggerClientEvent(root, "limparchat", root, getPlayerName( player ) ) -- client function abrirchat( nick_de_quem_limpou ) name = nick_de_quem_limpou; -- continuação da função Com esse código a variavel global name vai ser equivalente ao nick do jogador que limpou o chat. Outra coisa, vi que você repetiu varias vezes a função outputChatBox para "limpar" o chat, Você pode usar um loop para fazer isso mais facilmente: for _ = 1, 20 do -- 20 = numero de vezes que a função sera executada outputChatBox ( " ", root ); end
  14. function dxchat() dxDrawBorderedText(""..getPlayerName(localPlayer).." Está assaltando a loja", 197, 215, 197, 383, tocolor(255, 255, 255, textAlpha),1.00, font) dxDrawRectangle(168, 203, 468, 62, tocolor(0, 0, 0, 109), false) if fadeIn == false then textAlpha = textAlpha - 7 elseif fadeIn == true then textAlpha = textAlpha + 7 end checkAlpha() end
  15. Você tem que por a parte de aumentar/diminuir a opacidade na função dxchat, Ela que está sendo executada a cada frame.
  16. Porque você não seta a animação direto no lado do servidor ? Se você fizer isso no lado do client apenas ele (o jogador local) vai ver a animação, E uma dica, evite ao maximo usar os eventos de renderização, Eles são executados várias vezes por segundo, você não precisa verificar se o player esta algemado 30~60 vezes por segundo.
  17. Acho que usar parênteses para separar as operações já deve resolver o problema, tente: dxDrawImage(x * (564-cords), y * ( 737-(ls/2) ), x * ( 33+(ls or 0) ), y * ( 26+(ls or 0) ), "som.png", girar, 0, 0, tocolor(255, 255, 255, 255), true) dxDrawImage(x * (801-cords2), y * ( 737-(ls/2) ), x * ( 33+(ls or 0) ), y * ( 26+(ls or 0) ), "som.png", girar, 0, 0, tocolor(255, 255, 255, 255), true)
  18. You can use getAccountsBySerial to know how many accounts a serial has.
  19. dbConnect -- criar/abrir uma conexão com o database dbExec -- executar uma query, sem receber nenhum valor de volta dbQuery -- executar uma query, recebendo um resultado que pode ser usado com a função dbPoll dbPoll -- obter dados de uma query btw se você não tem experiencia com SQL você pode usar account datas.
  20. O Erro ocorre porque a variavel source não existe, Sendo assim você não pode obter o dinheiro de um player inexistente, Acredito que tenha sido apenas falta de atenção sua, Você pode passar o jogador direto no segundo parametro da função triggerServerEvent, assim o servidor já irá receber a variavel source automaticamente (você não precisa colocar ela na lista de parâmetros da função comprareagle. --client: triggerServerEvent("eaglecomprar", localPlayer) -- localPlayer vai ser o source do evento eaglecomprar -- server: function comprareagle () Se você ainda tiver duvidas sobre a função triggerServerEvent vale a pena olhar os parâmetros na wiki.
  21. Você quer saber qual será a data daqui 1 hora? Se sim é só fazer isso: local timestampAtual = getRealTime().timestamp local daquiUmaHora = timestampAtual + 3600; print ( daquiUmaHora ); No meu tópico sobre timestamp tem alguns cálculos uteis que você pode usar pra isso. Já se você quer fazer uma contagem regressiva de uma hora (não sei porque você vai querer isso mas enfim): local minutos = 60; setTimer ( function() minutos = minutos - 1; outputChatBox ( "Faltam " .. minutos .. " minutos !" ) end , 60000, 60 ) Não precisa nem usar timestamp, Lembrando que com a mesma lógica da pra fazer uma contagem progressiva.
  22. Não, o timestamp já corresponde aos segundos, você não precisa obter ele de novo (a não ser que você queira). local timestamp = 1466853270 local dia = getRealTime ( timestamp ).monthday -- obter o dia do timestamp acima local hora = getRealTime ( timestamp ).hour -- obter a hora -- etc... No exemplo acima se você não passar a variavel timestamp para a função getRealTime ela vai retornar o dia e a hora do momento em que você executou o script, mas como passamos o timestamp a função retorna o dia e a hora do timestamp.
  23. É só usar a função getRealTime, Ela tem o parâmetro seconds, que se você colocar o timestamp vai retornar a data do timestamp e não a do momento atual.
  24. É mais fácil usar uma tabela pra isso. local dias = { [0] = "Domingo"; [1] = "Segunda"; [2] = "Terça"; [3] = "Quarta"; [4] = "Quinta"; [5] = "Sexta"; [6] = "Sábado" } addEventHandler( "onClientRender", root, function () local time = getRealTime() local Days = time.weekday dxDrawText( dias[Days], 1045, 606, 1105, 624, tocolor(255, 255, 255, 255), 1.00, "default", "left", "center", false, false, false, false, false) end )
×
×
  • Create New...