Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    3,992
  • Joined

  • Last visited

  • Days Won

    183

Everything posted by Lord Henry

  1. Já foi avisado para você que dúvidas referentes a scripts devem ser feitas na seção Programação em Lua. Você está criando tópicos na seção de Tutoriais em Geral, aqui você posta Tutoriais pra ajudar os demais membros. Por favor, respeite as regras do fórum.
  2. Quando usar o source, quando declarar o botão no evento e quando usar o parâmetro getPropagated (o false): addEventHandler ("onClientGUIClick", button01, functionQualquer) -- Sem o false e declarando o botão que deve chamar essa função. Esse caso acima é recomendado para botões únicos e que não tenham parentes. Quando vc só tem um único botão, é mais fácil declará-lo direto no evento ativador. Por não existir um parente desse botão, não precisa do false. Se existisse um parente (como uma janela) dai precisaria do false, caso contrário a função seria ativada novamente para esse parente. addEventHandler ("onClientGUIClick", button01, functionQualquer, false) -- Com o false e declarando o botão. Esse caso com o false é recomendado para casos de um botão único e que possui algum parente, como uma guiWindow. O false evita que a janela seja considerada ao clicar no botão. Ativando a função somente 1 vez por clique. addEventHandler ("onClientGUIClick", root, functionQualquer) -- Sem declarar o botão e sem o false. Nesse último caso é o mais comum e recomendado para a maioria dos casos onde uma janela possui vários botões. Você não declara um botão específico no evento, usa-se root para que a função ative em qualquer guiElement clicável. Dentro da função, vc usa source para saber qual elemento foi clicado e se ele é igual a tal botão, por exemplo: if (source == button01) then -- Faz algo. elseif (source == button02) then -- Faz outra coisa. end Em vez de usar vários addEventHandlers para cada botão, e uma função diferente para cada botão, usa-se a mesma função e o mesmo addEventHandler para todos, diferenciando o que cada um dos botões faz através das condições. Isso é questão de otimização. Vários eventos pequenos são mais pesados do que um único evento grande.
  3. O false é usado em funções onde você especifica o botão no eventHandler em vez de usar o source para verificar qual o guiElement que foi clicado. O false indica que a função não deve pegar os elementos parentes ao clicar nos elementos filhos. Por exemplo, se vc clica em um botão, na verdade está clicando na janela também. Se não tiver o false, ele vai ativar a função 2x (uma por clicar na janela e outra por clicar no botão). O false evita que ele considere a janela ao clicar no botão. Se vc não declarar o botão direto no addEventHandler e usar o source em vez disso, então não precisa do false, pois ele só vai passar caso a condição do source for verdadeira. Note: If the GUI Element attached to this event has a parent element, this event will be triggered once the parent element of the attached element is clicked too. You can set the parameter getPropagated to false in the call to addEventHandler to prevent this.
  4. Inicie o resource "voice". Fará com que somente jogadores próximos escutem.
  5. Vc criou um painel em DX, depois tentou criar botões em CEGUI e tentou deixá-los invisíveis com setElementAlpha quando na verdade deveria ter usado guiSetAlpha para isso. Faça o painel inteiro em CEGUI se vc não tem conhecimento suficiente pra fazer em DX. A função que cria os botões não foi chamada em nenhum momento.
  6. Primeiramente veja as regras do fórum aqui: Segundamente, poste o código na formatação correta. Use o botão <> para postar códigos.
  7. Ah, vc fez tudo em DX... é mais complicado. Os textos dos campos e tabela vc deve usar variáveis, então só passar essas variáveis pro server fazer a verificação.
  8. Modifique o painel Admin para ocultar a label do IP usando guiSetVisible. A label vai continuar lá, porém não estará visível. (Só mexa no painel admin se tiver certeza do que está fazendo)
  9. Não entendi direito. Mas acho que vc quis dizer isso: Supondo que seja isso, vc pode criar campos de input com guiCreateEdit.
  10. Pessoal acha que temos bola de cristal? Sem mais informações do erro não temos como adivinhar o que é.
  11. @Dutchman101 Fake server: mtasa://142.4.223.97:22343 Official server: mtasa://144.217.223.111:22003 Violation: Copying established server's names/server cloning by pretending to be the official one. Proof: (screenshot) Another screenshot which the fake server' staff tells someone the server was created last week. (they banned the player who asked after this) Fake Facebook page: https://www.facebook.com/pg/Cidade-Vida-Real-RPG-1289355834552590/about/ Official Facebook page: https://www.facebook.com/pg/brasileirosforfun/about/ Official YouTube channel: https://www.youtube.com/c/CidadeVidaRealRPGbyBrasileirosForFun
  12. Também acho. Mas a parte de automatizar e-mail parece ser complexa. Ta aí uma área que não possuo conhecimento algum, que seria essa comunicação de dados "OFF MTA".
  13. Cria ela no onClientResourceStart e depois oculta com guiSetVisible. Dai só volta a mostrar pra quem for abrir o painel.
  14. Então, dai vc precisa de um triggerServerEvent e lá no server, fazer um triggerClientEvent no cliente desse outro cara. É necessário passar o nome do jogador selecionado por parâmetro, dai o server faz o esquema de verificar se o jogador existe com aquele nome, se existir manda o triggerClientEvent pra ele, abrindo o painel nele.
  15. Isso é client-side, amigo. Só vai acontecer em todos os clientes se no seu triggerClientEvent vc não especificar qual client quer ativar o evento. Quando alguém clica em um botão num painel, a função que aquele botão ativar no client só vai pra ele. A não ser que vc use um triggerServerEvent pra enviar pra geral via server-side. Geralmente vc não precisa declarar o jogador em uma função client-side, pois ela só vai pro localPlayer.
  16. Mas é pra isso mesmo que ela serve. Mostrar a janela (true) ou ocultar a janela (false).
  17. Só usar setSoundVolume no jogador pra aumentar a voz dele.
  18. Aí vc já está pensando "fora da casinha" mano. O que o painel admin faz é dar startResource, que é uma função nativa do MTA que inicia um resource. Você obrigatoriamente vai precisar usar essa função em algum momento para ativar um resource. Vc usando comandos ou não, vai usar a função em algum momento. Se vc bloquear essa função, o resource nunca será ativado. O fato de usar um comando "secreto" para ativar o resource não muda em nada, comandos são facilmente vazáveis.
  19. Verifique a ACL Group do usuário por meio da função isObjectInACLGroup. Qualquer resource de TAGs já faz isso, basta saber colar no seu código de chat.
  20. @#DeltaSCR Arrume a indentação, pra começar. Depois faça assim: addEventHandler("onClientResourceStart", resourceRoot, function () playersList = guiCreateGridList (0.30, 0.28, 0.11, 0.49, true) -- Gridlist com tamanho e posição relativa não é recomendável. local column = guiGridListAddColumn (playersList, "Jogadores", 0.9) if (column) then for _, player in ipairs (getElementsByType("player")) do guiGridListAddRow (playersList, string.gsub (getPlayerName(player), "#%x%x%x%x%x%x", "")) -- Adiciona os nomes dos jogadores sem código #hex. O getPlayerName não funcionará mais neste caso, pois o nome precisa ser exato com os códigos de cor. Usa-se getPlayerPartialName em vez disso. end end guiSetAlpha (playersList, 0.8) guiSetVisible (playersList, false) end) function createCEGUI () theWindow = guiCreateWindow (0.27, 0.23, 0.45, 0.53, "Companhia Telefonica TSB", true) guiWindowSetMovable (theWindow, false) guiWindowSetSizable (theWindow, false) --// EDITS memoChat = guiCreateMemo (0.02, 0.08, 0.96, 0.78, "\n", true, theWindow) editText = guiCreateEdit (0.02, 0.89, 0.97, 0.08, "Digite sua mensagem aqui...", true, theWindow) end function DeltaSCR_Click (button, state, absoluteX, absoluteY) if button ~= "left" or state ~= "down" then return end -- Se o botão usado para o clique não for o esquerdo ou o botão não estiver sendo apertado, então nada acontece. local row = guiGridListGetSelectedItem (playersList) -- row recebe o índice da linha selecionada, sendo 0 se for a primeira linha, 1 se for a segunda e assim por diante. if row >= 0 then -- Se existe algum item selecionado, então: (row = -1 se nenhum item estiver selecionado) local namePlayer = guiGridListGetItemText (playersList, row, 1) -- Recebe o texto do item que estiver na primeira coluna do item selecionado. local thePlayer = getPlayerFromPartialName (namePlayer) -- É necessário função útil para isso funcionar, pois namePlayer não tem os códigos de cores. -- SEU CÓDIGO AQUI. end end addEventHandler ("onClientGUIClick", playersList, DeltaSCR_Click, false) -- Estava errado playerList, sem o S function getPlayerFromPartialName (name) -- Função útil. local name = name and name:gsub("#%x%x%x%x%x%x", ""):lower() or nil if name then for _, player in ipairs (getElementsByType("player")) do local name_ = getPlayerName(player):gsub("#%x%x%x%x%x%x", ""):lower() if name_:find(name, 1, true) then return player end end end end Hahauahauahuahuhauahua
  21. Vai dar erro na linha 15. playerList, row e column não foram declarados em lugar nenhum.
  22. Sobre viver de scripts... Depende o quanto de renda vc considera o suficiente para viver. Também depende do seu nível de conhecimento, para conseguir criar vários tipos de resources diferentes, com mais qualidade e que funcionem sem problemas. Outra variável a ser levada em consideração é sua rede de clientes e quantos serviços simultâneos vc é capaz de fazer ao mesmo tempo, sem abandonar os clientes já existentes. Tudo é um grande DEPENDE. Na minha opinião, não dá pra viver de scripts. Pelo menos não como renda única. Levando em conta a situação financeira do país atualmente, etc. e também o fato de que o MTA não vai existir para sempre, sabemos que o auge do MTA já passou, a comunidade está cada vez mais migrando para os jogos mais novos. Enfim, é minha opinião levando em conta esses fatores. O máximo que vc puder sem se cansar demais. Faça um teste, comece estudando menos horas e nas semanas seguintes vc aumenta o tempo. Quando vc perceber que a partir de certo ponto vc fica cansado demais para aprender, dai vc mantém aquela quantidade limite de horas. Varia de pessoa pra pessoa.
  23. Olá, vou deixar minha opinião também, apesar do atraso. Os sites são bons, oficiais e confiáveis. O primeiro link está na versão errada. O MTA usa a versão LUA 5.1 e não a 5.2 que vc está lendo. Esse primeiro site é mais voltado para a linguagem LUA pura (vale lembrar que LUA é uma linguagem de programação inventada por brasileiros \O/ por isso que eles disponibilizam o manual em português). Muitas coisas dali vc usa no MTA, principalmente as funções matemáticas, as funções de manipulação de tabelas e as funções de manipulação de strings (cadeias de caracteres). Vale lembrar que para entender o que está escrito lá, vc já deve ter conhecimento avançado com lógica de programação (ou algoritmos computacionais). Caso ainda seja novato nesse assunto, recomendo estas videoaulas no YouTube sobre Algoritmos. O segundo link é a Wiki do MTA. Existem algumas páginas em português mas a maioria é em inglês, então sem inglês não rola de entender a Wiki e muito menos usando tradutor. Sem inglês vc não consegue nada no ramo da tecnologia, simples assim. Esse site é mais voltado para as funções nativas do MTA (como CreateVehicle por exemplo) e também algumas funções úteis inventadas pelos usuários para facilitar nossas vidas (como por exemplo DxDrawBorderedText). A vantagem da Wiki é que ela também mostra exemplos prontos das funções em uso. Sendo assim vc consegue entender perfeitamente o que cada função faz e como usá-las.
×
×
  • Create New...