Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,971
  • Joined

  • Last visited

  • Days Won

    179

Everything posted by Lord Henry

  1. @angelunivc precisa escolher uma linguagem de programação específica para desenvolvimento de aplicativos e sites. Recomendo que estude JavaScript, CSS e HTML para sites. Tem tutoriais no Youtube.
  2. Não. Isso é nativo do MTA e não pode ser alterado pelos servidores. A parte server-side ali do código já garante que nenhuma mensagem de teamsay seja enviada pelos jogadores.
  3. Faltou fechar aspas ao final do link do vídeo.
  4. -- CLIENT-SIDE addEventHandler("onClientKey", root, function(button, state) -- Se o jogador pressionar ou soltar uma tecla, ativa essa essa função: if (button == "y" and state) then -- Se a tecla for o Y e for pressionada, então: cancelEvent() -- Cancela a função e a tecla Y não vai funcionar. (ela ainda funcionará para digitar comandos) end end) -- SERVER-SIDE addEventHandler("onPlayerChat", root, function(message, messageType) -- Ativa essa função quando alguém tentar usar o chat. if (messageType == 2) then -- Se for usando o teamsay, então: outputChatBox("Team Chat está desabilitado.", source, 255, 150, 0) -- Opcional, manda essa mensagem pro jogador que tentou. cancelEvent() -- Não envia a mensagem que o jogador tentou. end end) Vale lembrar que se o jogador trocar a tecla do teamsay nas configurações do menu ESC para outra tecla, ele vai conseguir abrir o teamsay pela outra tecla que ele configurar. Da mesma forma, se ele colocar o chat normal na tecla Y, este chat deixará de funcionar para o jogador.
  5. As animações sexuais foram removidas da versão de PC do GTA:SA Então sim, precisa obter elas de outra forma para usar.
  6. Ele está reclamando que data["img"] e data["imgcicle"] são nulos. Você precisa adicionar um verificador antes para saber se eles existem. if (data["img"]) then if (data["imgcicle"]) then
  7. @SciptNovatopor algum bug interno do MTA, veículos criados direto no jogador não ativam o evento onVehicleEnter. Para contornar isso, tente utilizar a função onElementStartSync que é acionada sempre que um novo elemento começa a ser sincronizado por um jogador. Adicione verificadores de segurança para garantir que o script só considere veículos e que o veículo seja o mesmo que o jogador está dentro.
  8. @filsk faltou colocar um takePlayerMoney (source, 34) no script. Bem embaixo da linha do getPlayerMoney.
  9. Se você olhar a Wiki do DxDrawText, vai perceber que existe o parâmetro colorCoded. Coloque-o como true e então você pode usar códigos #HEX no seu texto da mesma forma que usaria em um outputchatbox. dxDrawText(ID.." -#00FF00 VOZ ATIVADA #FFFFFF- FPS: 70 -", x*1600, y*752, x*1193, y*775, tocolor(255, 255, 255), 1, "default", "right", "top", false, false, false, true, false) else dxDrawText(ID.." -#FF0000 VOZ DESLIGADA #FFFFFF- FPS: 70 -", x*1600, y*752, x*1193, y*775, tocolor(255, 255, 255), 1, "default", "right", "top", false, false, false, true, false)
  10. Faça o script client-side. Assim um jogador não interfere na plantação de outro. E todos podem trabalhar ao mesmo tempo na plantação. Mas na parte de pagar o jogador, dai faça server-side.
  11. @Pedrowfavor não reviver tópicos antigos.
  12. @DiogoSZvocê vai precisar basicamente disso: createMarker - Cria o marker onde o player vai encostar para ser teleportado junto com seu veículo. onMarkerHit - Evento que ativa alguma função ao colidir no marker. setElementPosition - Coloca o elemento que colidiu no marker em uma posição específica. (teleporta ele pra essa posição) Obs: Teleporte o veículo em vez do jogador, pois teleportar um jogador que está dentro de veículo não funciona. É necessário teleportar o veículo em vez disso, então os ocupantes dele vão junto. Para obter o veículo do jogador você vai precisar usar getPedOccupiedVehicle Vou começar o script só para facilitar pra vc e depois faça sua parte: local theMarker = createMarker (2493.37, -1681.07, 12.35, "cylinder") -- Cria um marker na frente da casa do CJ. addEventHandler ("onMarkerHit", resourceRoot, function (hitElement) -- Ativa essa função ao colidir em algum marker deste resource. if (hitElement and getElementType (hitElement) == "player") then -- Se o elemento que colidiu no marker for um player, então: if (source == theMarker) then -- Se o marker que foi colidido for o theMarker, então: (caso tenham outros markers criados neste resource, isso evita conflitos) -- Continue a partir daqui. outputChatBox ("Tentou teleportar.", hitElement) -- Troque essa linha por um setElementPosition ... end end end)
  13. Agora está certinha a indentação. Mais uma dica: Você pode trocar todos os getRootElement() por root
  14. Pra começar, você precisa corrigir a indentação do seu código. Veja aqui como fazer isso:
  15. @Lipee Lima copiou errado o código. Tente novamente:
  16. O painel admin tem uma função de tirar print da tela do jogador e deixar salva para outros Staffs poderem acessar pelo painel, sugiro que dê uma estudada nele. Você seleciona o jogador no painel admin, e dai clica no botão "screenshot" para tirar uma print da câmera do jogador. Essa print fica disponível no painel para qualquer Staff poder ver.
  17. server.lua addEventHandler ("onPlayerLogin", root, function (_, currAcc) -- Ativa essa função quando algum player logar. print ("Logou na moral.") -- Manda isso no /debugscript 3 triggerClientEvent (source, "recebeuLogin", source) -- Ativa esse evento no client de quem logou. end) client.lua local screen = Vector2 (guiGetScreenSize()) -- Obtém a resolução do jogador e guarda numa variável. addEvent ("recebeuLogin", true) -- Adiciona esse evento que será ativado lá pelo server.lua addEventHandler ("recebeuLogin", root, function () -- Ativa essa função quando esse evento for chamado. addEventHandler ("onClientRender", root, renderTexto) -- Começa a executar a função renderTexto a cada frame. end) function renderTexto () dxDrawText ("(ANIMAÇÃO MAROTA AQUI)", 0, 0, screen.x, screen.y, tocolor(255, 255, 0, 255), 3, "default", "center", "center") -- Mostra isso na tela a cada frame. setTimer (removeEventHandler, 5000, 1, "onClientRender", root, renderTexto) -- Depois de 5 segundos, para de mostrar o texto na tela. end Obs: Fiz de cabeça. É necessário testar.
  18. O evento que citei só funciona server-side. Seu script é client-side. Você vai precisar de um triggerClientEvent.
  19. Sim, é possível. Porém extremamente pesado de processar.
  20. Não é possível descompilar luac. O descompilador é de uso exclusivo da administração do MTA para verificar scripts supostamente maliciosos. Jogadores não possuem acesso ao descompilador.
  21. Ou você pode simplesmente usar um elementData no jogador, onde cada gamemode só funciona nos jogadores que possuam um valor específico nesse elementData. É claro que isso será muito complexo, visto que todos os resources que dependem do gamemode precisarão fazer essa verificação de data também, o que vai prejudicar seu desempenho no servidor. Outra alternativa seria existir uma tabela global de jogadores onde cada jogador entra em um índice diferente após escolher o Gamemode no painel de login. Então cada gamemode e cada resource que dependa de gamemode irá verificar essa tabela usando um call (exports). gamemodeDeGeral = { ["Freeroam"] = {}, ["Race"] = {}, ["DM"] = {}, ["DayZ"] = {}, ["RPG"] = {}, } addEventHandler("onPlayerLogin", root, function(thePlayer) table.insert(gamemodeDeGeral["Freeroam"], thePlayer) -- Exemplo para inserir um player que acabou de logar no Freeroam. end) addEventHandler("onPlayerLogout", root, function(thePlayer) for i,p in pairs (gamemodeDeGeral["Freeroam"]) do if (p == thePlayer) then gamemodeDeGeral["Freeroam"][i] = nil -- Exemplo para remover um player da tabela Freeroam ao deslogar. return end end end)
  22. O parâmetro id vai ser sempre o que o jogador digitou após o comando, então ele pode ser tanto o ID de um jogador ou valor de dinheiro. O parâmetro qnt só vai existir se dois valores forem especificados após o comando. Se o jogador apenas especificar um, então qnt será nil. Ou seja, o comando /money 123123 fará com que id seja 123123 e qnt seja nil Falta verificações de segurança, você precisa garantir que tanto o id quanto qnt sejam números. Além de verificar se os valores informados são números, você precisa garantir que eles sejam inteiros (o player pode tentar informar números decimais, passando pelo tonumber). Adicione uma condição verificando se qnt existe. Caso não exista, considere o parâmetro id como sendo a quantidade e então use o ID de si mesmo. Adicione uma condição verificando se id existe. Caso não exista, dê feedback de erro de sintaxe. O segundo erro acontece pois id não deve estar depois do targetPlayer. Basta removê-lo dali que resolve o erro. Não use nome de função igual ao comando que ativa ela. Para facilitar de entender: function myMoney(thePlayer, cmd, id, qnt) -- thePlayer é quem executou o comando. if (qnt) then -- Se qtd existe (se foram especificados dois valores após o comando), então: local playerQTD = tonumber(qtd) -- Torna a string qtd em um número. if (playerQTD) then -- Se qtd é um número, então: if (math.floor(playerQTD) == playerQTD) then -- Se qtd é um integer, então: if (id) then -- Se id existe, então: local playerID = tonumber(id) -- Torna a string id em um número. if (playerID) then -- Se id é um número, então: if (math.floor(playerID) == playerID) then -- Se id é um integer, então: local targetPlayer = getPlayerID(playerID) -- Espero que você tenha essa função criada em outro lugar, pois ela não existe nativamente. if (targetPlayer) then -- Se existe um jogador com este ID, então: setPlayerMoney(targetPlayer, playerQTD) -- Dá o dinheiro pro jogador com este ID. else outputChatBox ("Erro: Jogador com o ID '"..id.."' não foi encontrado.", thePlayer, 255, 0, 0) end else outputChatBox ("Erro: ID '"..id.."' precisa ser um número inteiro.", thePlayer, 255, 0, 0) end else outputChatBox ("Erro: ID '"..id.."' precisa ser um número.", thePlayer, 255, 0, 0) end else -- Se id não existe, então: outputChatBox ("Erro de sintaxe: #ffffff/money <ID> <quantidade>", thePlayer, 255, 0, 0, true) end else outputChatBox ("Erro: A quantidade de dinheiro precisa ser um número inteiro.", thePlayer, 255, 0, 0) end else outputChatBox ("Erro: A quantidade de dinheiro precisa ser um número.", thePlayer, 255, 0, 0) end elseif (id) then -- Se não existe qnt mas existe id (só foi especificado um valor após o comando), então: local playerQTD = tonumber(id) -- Torna a string id em um número. Usando o valor de id como quantidade. if (playerQTD) then -- Se id é um número, então: if (math.floor(playerQTD) == playerQTD) then -- Se id é um integer, então: setPlayerMoney(thePlayer, playerQTD) -- Dá o dinheiro pra si mesmo. else outputChatBox ("Erro: O valor especificado após o comando precisa ser um número inteiro.", thePlayer, 255, 0, 0) end else outputChatBox ("Erro: O valor especificado após o comando precisa ser um número.", thePlayer, 255, 0, 0) end else -- Se não existe id e nem qtd, então: outputChatBox ("Erro de sintaxe: #ffffff/money <ID> <quantidade>", thePlayer, 255, 0, 0, true) end end addCommandHandler("money", myMoney) -- Não se usa nome de função igual ao comando. Mude um dos dois para não dar conflito. Obs: É recomendável restringir esse comando, caso contrário qualquer player pode dar dinheiro pra si mesmo ou pros outros. Versão resumida sem nenhuma verificação de segurança: (pode gerar erros no debugscript) function myMoney(thePlayer, cmd, id, qnt) if (qnt) then -- Se qnt existe, então: local targetPlayer = getPlayerID(tonumber(id)) -- Obtém o jogador que tem o ID especificado. setPlayerMoney(targetPlayer, qnt) -- Dá o dinheiro de valor qnt para quem tem o ID de valor id. else -- Se qnt não existe, então: setPlayerMoney(thePlayer, id) -- Dá o dinheiro de valor id em si mesmo. end end addCommandHandler("money", myMoney) Obs: Vale lembrar que setPlayerMoney vai deixar o dinheiro do jogador igual a quantidade especificada. Enquanto que givePlayerMoney vai somar o valor especificado no dinheiro atual do jogador e a função takePlayerMoney vai subtrair o valor especificado no dinheiro atual do jogador.
×
×
  • Create New...