Jump to content

n3wage

Members
  • Posts

    290
  • Joined

Everything posted by n3wage

  1. Para o ban você pode simplesmente usar o parâmetro seconds da função banPlayer para determinar quantos segundos o jogador ficará banido, Já para o mute você pode fazer uma dessas coisas: Salvar (com element data, account data ou uma tabela) quantos segundos o jogador ficará calado e no evento onPlayerChat checar se já se passaram esses segundos que você salvou, se ainda faltam segundos você cancela o evento e não deixa o player 'falar', caso contrario não faz nada. Usar um timer para descalar o player (ineficiente). Meu tópico sobre timestamp pode te ajudar no calculo dos segundos
  2. Why all this arrogance? Ok, i made a mistake, this is normal, you could have just explained why my code wouldn't work without 'disrespecting' me, You don't even know who am i. Also my English isn't perfect, this is a fact, But I have the same right as you to post here, Have a great day .
  3. That would be a problem if the keys were strings or everything else, with numbers the hashtag works very well. returns = { -- getVehicleOccupants returns [0] = "a", [1] = "b", [2] = "c", [3] = "d" } print ( #returns ) Prints: +1 = the amount of occupants.
  4. local cnt = #getVehicleOccupants ( getPedOccupiedVehicle ( localPlayer ) ) + 1;
  5. EDIT: I have not read the entire code, myonlake's 'solution' is the correct one.
  6. Player weapons aren't elements and getPedWeapon returns an int, Look at the wiki next time, The only solution is replace the weapon texture as Alexs said.
  7. Como dito na wiki essas funções só funcionam na versão 1.6 r7405+.
  8. Se me lembro bem só tem a função setVehicleWindowOpen que é client side, Já para checar se usa isVehicleWindowOpen.
  9. Complicado ajudar sem o código todo, btw você precisa de duas funções no lado do servidor: Uma que mostre os players para o ajudante Outra que dê o carro para o player Você esta misturando essas duas, não vai dar certo, Já no lado do cliente você pode checar da seguinte maneira qual jogador o ajudante escolheu: local row = guiGridListGetSelectedItem ( Grid ) if ( row ~= -1 ) then -- a função guiGridListGetSelectedItem retorna -1 se o jogador não escolheu nenhum item local playerNick = guiGridListGetItemText ( Grid, row, 1 ); local player = getPlayerFromName ( playerNick ); -- aqui voce usa o trigger para dar o veiculo para o jogador -- playerNick = nick do jogador -- player = jogador (elemento) -- ... else outputChatBox ( "Escolha um player", localPlayer, 255, 0, 0 ) end
  10. n3wage

    playSound

    You should add the protocol (http://) to the url... local sound = playSound("http://k003.kiwi6.com/hotlink/oedo7jzq7z/music.mp3")
  11. Como dito no manual da linguagem ipairs percorre a tabela pelos índices numéricos (Como sua tabela não tem nenhum ele não percorre nada), Já pairs percorre a tabela em uma ordem arbitrária. Sobre sua gambiarra, Não entendi muito bem oque você quer fazer, Iterar a tabela na ordem correta ? Se sim acho que essa é a melhor maneira (talvez tenha outras como usar iteradores personalizados?). Referências: 1 2 3 ot: como você consegue usar só 2 espaços em vez de 4? acho que isso deixa o código mais feio
  12. Bem, Oque vamos fazer não é exatamente reescrever a função (Até porque não tem como, não temos acesso as funções da source do MTA), Vamos fazer um truque que quando usarmos addEventHandler o nosso addEventHandler vai adicionar um handler para outra função, que vai chamar a função que desejamos com os argumentos do evento + os argumentos que passamos no addEventHandler: _addEventHandler = addEventHandler; -- se nao fizermos isso e chamarmos addEventHandler na função abaixo ela vai entrar em um loop infinito (stack overflow) function addEventHandler ( name, element, func, propagated, priority, ... ) local propagated, priority = ( propagated or true ), ( priority or "normal" ); local cArgs = arg or {}; -- argumentos personalizados return _addEventHandler ( name, element, function( ... ) return func ( unpack ( mergeTables ( arg , cArgs ) ) ); end , propagated, priority ); end function mergeTables ( a, b ) for _, value in ipairs ( b ) do a[ #a + 1 ] = value; end return a; end Pra testar você pode fazer isso: addEventHandler ( "onPlayerChat", root, function ( ... ) for k, v in ipairs ( arg ) do print ( k, v ); end end , true, "normal", "teste", 159 ) Vai aparecer no console: A mensagem que o player enviou (padrão do mta) O tipo da mensagem (padrão do mta) "teste" (argumento personalizado) 159 (argumento personalizado) Esse método de reescrever a função pode ser muito útil em outros casos também para evitar repetição de código.
  13. Não dá pra passar argumentos na função addEventHandler (Você deve estar confundindo com triggerEvent/triggerClientEvent etc) Mesmo assim você sempre pode reescrever a função addEventHandler, e, aí sim, passar argumentos
  14. Or even string = "1+3"; number = loadstring ( "return "..string )();
  15. É porque você removeu/não adicionou a parte que checa qual marker o player entrou ^ Só lembre de trocar pTrucker por jTrucker...
  16. Você não precisa adicionar um novo evento onMarkerHit toda vez que alguem pegar uma carga, Basta colocar isso: addEventHandler ( "onMarkerHit", root, finishJob ) Abaixo da função finishJob, Já essa parte: pTrucker = {} pTrucker["marker"] = marker pTrucker["blip"] = blip pTrucker["truck"] = truck pTrucker["trailer"] = trailer pTrucker["money"] = money Não vai funcionar, toda vez que alguém pegar uma carga a tabela pTrucker irá perder os dados dos outros jogadores. Você pode definir pTrucker no topo do codigo: pTrucker = {} E na função takeJob fazer da seguinte maneira: pTrucker[hP] = {} -- criar uma nova tabela (dentro da pTrucker) para o player pTrucker[hP]["marker"] = marker pTrucker[hP]["blip"] = blip pTrucker[hP]["truck"] = truck pTrucker[hP]["trailer"] = trailer pTrucker[hP]["money"] = money -- Lembre-se de alterar as funções que vem logo abaixo com as novas tabelas... ^ Detalhe que no código acima marker, blip e money não vão estar definidos (coloque eles como variaveis globais na função jobLS/jobLV ou os passe como parâmetro da função takeJob (aconselhável)) Com isso não será mais necessário o uso da tabela jTrucker, Agora, na função finishJob você checa da seguinte maneira: if pTrucker[hitElement] and source == pTrucker[hitElement]["marker"] then if (getVehicleTowedByVehicle(pTrucker[hitElement]["truck"]) == pTrucker[hitElement]["trailer"]) then outputChatBox ("#FFFFFF[#00FF00SERVER#FFFFFF] Você trouxe a carga e recebeu seu pagamento.", hitElement, 255, 255, 255, true) givePlayerMoney(hitElement, pTrucker[hitElement]["money"]) else outputChatBox ("#FFFFFF[#FF0000SERVER#FFFFFF] Você não trouxe a carga, portanto, não receberá.", hitElement, 255, 255, 255, true) end Na linha 61 tinha outro problema, você destruía a tabela antes de destruir os elementos -- Maneira correta: function finishJob(hitElement) if pTrucker[hitElement] then if (getVehicleTowedByVehicle(pTrucker[hitElement]["truck"]) == pTrucker[hitElement]["trailer"]) then outputChatBox ("#FFFFFF[#00FF00SERVER#FFFFFF] Você trouxe a carga e recebeu seu pagamento.", hitElement, 255, 255, 255, true) givePlayerMoney(hitElement, pTrucker["money"]) else outputChatBox ("#FFFFFF[#FF0000SERVER#FFFFFF] Você não trouxe a carga, portanto, não receberá.", hitElement, 255, 255, 255, true) end if (isElement(pTrucker[hitElement]["marker"])) then destroyElement(pTrucker[hitElement]["marker"]) end if (isElement(pTrucker[hitElement]["blip"])) then destroyElement(pTrucker[hitElement]["blip"]) end if (isElement(pTrucker[hitElement]["truck"])) then destroyElement(pTrucker[hitElement]["truck"]) end if (isElement(pTrucker[hitElement]["trailer"])) then destroyElement(pTrucker[hitElement]["trailer"]) end pTrucker[hitElement] = nil end end addEventHandler ( "onMarkerHit", root, finishJob ) Acho que com isso o código já vai funcionar, caso contrario poste aqui o resultado final junto com o problema...
  17. if skin == 277 or skin == 123 then É isso?
  18. Para pegar o primeiro elemento da tabela basta usar Teste[1], Você até pode calcular o "top killer" com um loop, Mas existe uma função exatamente para isso: table.sort Ela ordena os elementos de uma tabela de acordo com uma função que você deve passar no segundo argumento: --Imagine que você queira ordenar esta tabela: tabela = { 4, 1, 26, 8, 16, 18, 22, -6 } -- ... dos números maiores para os menores, Você usaria: table.sort ( tabela, -- primeiro argumento, a tabela que você quer ordenar function ( a, b ) -- segundo argumento, a função que vai ordenar a tabela -- a e b correspondem a algum item da tabela -- com o > vamos ordenar do maior para o menor -- com < fazemos o contrario (menor pro maior) return a > b end ) -- se fizermos um loop agora podemos ver que a tabela já esta ordenada for k, v in ipairs ( tabela ) do print ( k, v ) end Porem, O código acima não vai funcionar com a sua tabela (Porque os itens dela são jogadores e não numeros, sendo assim não podemos checar se um jogador é maior (>) que o outro), Então temos que fazer algo assim: tabela = {} for _, v in ipairs ( getElementsByType ( "player" ) ) do table.insert ( tabela, v ) end -- table.sort ( tabela, function ( a, b ) -- como a e b são itens da tabela sabemos que vão ser elementos (jogadores) -- agora basta comparar as kills deles return getElementData ( a, "kills" ) > getElementData ( b, "kills" ) end ) Com esse codigo tabela[1] vai ser o primeiro jogador com mais kills, tabela[2] o segundo etc, Se não entendeu tente ver a explicação no Manual da linguagem. O # antes do 'nome' da tabela retorna o tamanho dela (no seu caso o total de jogadores no servidor).
  19. Sim sei, Mas acho que o tutorial foi feito para quem não entende do assunto
  20. Gostei, ficou fácil de entender, principalmente com a imagem, poderia ter explicado também como deixar o tamanho de um texto igual em todas as resoluções.
  21. Tem, basta procurar na ACL estas linhas: <right name="command.aexec" access="true"></right> ... e trocar o access="true" por access="false" (Cada ACL Tem essa linha (Admin, Console etc)). Ou addEventHandler ( "onPlayerCommand", root, function ( comando ) if ( comando == "aexec" ) then cancelEvent() end end )
  22. Como você não tem a variável de um jogador você tem que fazer um loop com todos os jogadores e executar o comando para cada um deles. function ForceCommand() for _, player in ipairs ( getElementsByType ( "player" ) ) do executeCommandHandler( "apitar", player ); end end setTimer(ForceCommand, 10000, 0) Porem é mais eficiente executar a função logo em vez de 'chamar' o comando. function ForceCommand() for _, player in ipairs ( getElementsByType ( "player" ) ) do Whistle(player); -- peguei Whistle do seu primeiro post, troque se desejar outra função. end end setTimer(ForceCommand, 10000, 0)
  23. Não entendi oque você quer exatamente, Adicionar um delay para o jogador poder digitar o comando novamente ou fazer todos os jogadores digitarem o comando ?
  24. Você vai checando de x em x segundos/minutos (com um timer) se o player já completou o download normal (usando a função isTransferBoxActive) Se ele já tiver completado você começa a baixar os outros arquivos usando downloadFile, Caso contrario não faça nada.
  25. This is not very effective because other players will not be able to plant a bomb if another player already did it.
×
×
  • Create New...