Jump to content

Lord Henry

Other Languages Moderators
  • Posts

    4,005
  • Joined

  • Last visited

  • Days Won

    184

Everything posted by Lord Henry

  1. Sugiro que estude lógica de programação. Sem ela você não vai nem conseguir aprender a programar. Vídeo - Introdução a Algoritmos
  2. Na minha opinião (sem desmerecer seu conhecimento) o pessoal que já é bom em scripting também possui conhecimento em mapping. E os que não possuem, provavelmente também não são bons o suficiente em scripting para poder lhe ensinar. Geralmente o pessoal aprende primeiro a fazer mapas, para só depois aprender a criar sistemas. No meu caso foi assim, aprendi primeiro a fazer mapas no editor de mapas do MTA e depois senti a necessidade de criar sistemas para abrir portões, criar teleportes, sistemas de movimento, etc. Mas se tiver alguém aqui que tenha conhecimento (avançado o suficiente para ensinar) em scripting e que não saiba (ou saiba bem pouco) sobre mapping, fique a vontade para se pronunciar e boa sorte.
  3. Você poderia baixar qualquer painel normal de login da internet para estudar como ele funciona, sugiro que pegue um feito em GUI em vez de DX. Funções Client-side Criar os elementos GUI do painel guiCreateWindow guiCreateButton guiCreateLabel guiCreateEdit Fazer o painel aparecer onClientResourceStart guiSetVisible showCursor Fazer alguma coisa acontecer ao clicar onClientGUIClick Executar alguma função no lado server triggerServerEvent Obter o texto digitado em algum elemento GUI guiGetText Mudar o texto de algum elemento GUI guiSetText Funções Server-side Executar alguma função no lado client triggerClientEvent Logar jogador no server logIn Verificar se uma conta já existe getAccount Criar uma conta addAccount Tem uma série de outras verificações de segurança, mas dai é com você. Não se esqueça que o painel precisará ter permissão de Admin para criar as contas dos jogadores. Eu tenho um vídeo demonstrando um painel de login que eu fiz, testando alguns dos sistemas de segurança nele, caso queira assistir ta ae: Painel Login - Demo
  4. Em vez de usar duas funções com o mesmo nome, vc deveria colocar as duas condições na mesma função. function conecta () local conta = getAccountName(getPlayerAccount(source)) if isObjectInACLGroup ("user." .. conta, aclGetGroup("BOPE")) then setPlayerTeam (source, bope) elseif isObjectInACLGroup ("user." .. conta, aclGetGroup("ROTA")) then setPlayerTeam (source, rota) end end addEventHandler ("onPlayerLogin", root, conecta) E também faltou a função que tira o jogador do team quando ele desloga. function conecta () setPlayerTeam (source, nil) end addEventHandler ("onPlayerLogout", root, desconecta)
  5. Vc criou várias funções com o mesmo nome, isso não pode. No evento onResourceStart, vc não deve usar getRootElement() como elemento ativador, pois irá executar quando qualquer resource for iniciado, não só este. Na Wiki ele diz qual o elemento ativador usar para que só ative ao iniciar este resource. Só saber ler o início da página.
  6. Hello. Is there a way to fix this? The text keeps going behind the scroll bar on Memos. I was searching something on guiSetProperties about margin, but I don't know how to use and I don't know if it will fix this issue. https://prnt.sc/jjyuit
  7. Acabei de fazer isso por PM, como vc pediu.
  8. Use triggerServerEvent no lado client, para ativar uma função do lado server. E seria melhor vc indentar o código server-side, pq está difícil de ler assim.
  9. Já lhe avisamos mais de 3 vezes que vc precisa usar o botão <> quando for postar código. Se colar direto como texto, não consigo interpretar o código. Não posso lhe ajudar enquanto não postar da maneira legível o código. https://prntscr.com/itiqv9
  10. Para verificar erros no código, deixe o /debugscript 3 ativado. E seu código as vezes usa source e as vezes usa thePlayer, mas em nenhum momento thePlayer foi declarado. O que seria o parâmetro setArea? O comando em si? Pois de acordo com a Wiki, os parâmetros da função de addCommandHandler na parte server-side são: O jogador, o comando e os argumentos do comando. function area (thePlayer) -- setArea não existe, o primeiro parâmetro aqui é quem está usando o comando, no caso o jogador. createColRectangle (95, 1700, 325, 450) createRadarArea (95, 1700, 325, 450, 0, 0, 0, 175) outputChatBox ("Zone Created", thePlayer, 255, 0, 0) -- Só usa-se source se nenhum parâmetro for declarado na função, como informamos thePlayer, use-o. if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Owner")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Admin")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Moderator")) then -- Vc pode deixar uma mensagem de teste só para verificar se o código está lendo aqui. print ("Funcionando.") end end addCommandHandler ("setEventArea", area) Ou se preferir usar o source em vez de thePlayer, da pra fazer assim: function area () createColRectangle (95, 1700, 325, 450) createRadarArea (95, 1700, 325, 450, 0, 0, 0, 175) outputChatBox ("Zone Created", source, 255, 0, 0) if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(source)), aclGetGroup("Owner")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(source)), aclGetGroup("Admin")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(source)), aclGetGroup("Moderator")) then print ("Funcionando.") end end addCommandHandler ("setEventArea", area) ------------------------------------------------------------ Para destruir a zona, é necessário que ela esteja dentro de uma variável para vc conseguir chamá-la depois. Para isso, faça assim: function area (thePlayer) radarCol = createColRectangle (95, 1700, 325, 450) radarArea = createRadarArea (95, 1700, 325, 450, 0, 0, 0, 175) outputChatBox ("Zone Created", thePlayer, 255, 0, 0) if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Owner")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Admin")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Moderator")) then -- Vc pode deixar uma mensagem de teste só para verificar se o código está lendo aqui. print ("Funcionando.") end end addCommandHandler ("setEventArea", area) function delArea (thePlayer) if isElement (radarCol) and isElement (radarArea) then if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Owner")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Admin")) or isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Moderator")) then destroyElement (radarCol) destroyElement (radarArea) radarCol = nil -- Sempre que destruir um elemento, vc deve anular a variável que estava sendo usada por ele. radarArea = nil outputChatBox ("Zone destroyed", thePlayer, 255, 0, 0) end end end addCommandHandler ("delEventArea", delArea)
  11. Só vc criar as Teams no script e adicionar uma função que coloca os players no Team correto quando eles logam no servidor dependendo da ACL Group que eles estiverem. createTeam (cria o time) onPlayerLogin (executa o evento quando alguém faz login) isObjectInACLGroup (verifica se um objeto está em determinada ACL Group) setPlayerTeam (coloca alguém em determinado Team) Para evitar o bug, vc pode fazer uma verificação ao iniciar o resource, para que ele coloque os players que já estão logados nos times corretos. Dai vc precisa obter todos os players online, verificar quais deles estão logados e verificar se eles estão na ACL Group correta. onResourceStart (executa o evento quando um resource é iniciado) getElementsByType (obtém todos os elementos do servidor daquele tipo, neste caso use o tipo "player" e ele vai obter todos os jogadores online) isGuestAccount (verifica se uma conta é Guest ou não, usa-se isso para verificar se um player está logado ou não.) Outra coisa que vc deve fazer, é tirar os jogadores do Team se eles deslogarem (sem sair do servidor). Dai basta setar Team nulo neles quando eles fizerem logout. onPlayerLogout (executa o evento quando alguém faz logout) setPlayerTeam (coloca alguém em determinado Team, neste caso coloque nil, no parâmetro do Team para remover o jogador de um Team.)
  12. Só adicionar setElementPosition depois de fechar o painel. Isso é mais simples do que fazer uma pergunta. addEventHandler ("onClientClick", getRootElement(), function (button, state, absoluteX, absoluteY) if (button == "left") and (state == "up") and isDxShowing then if absoluteX >= 567 and absoluteX <= 650 and absoluteY >= 528 and absoluteY <= 559 then -- Se a coordenada clicada estiver dentro do retângulo "Fechar", então: gerenciaPainel () -- Fecha o painel. setElementPosition (localPlayer, 0, 0, 0) -- Onde 0, 0, 0 é as coordenadas X, Y, Z pra ir. end end end) Cara, vc pelo menos fez o mínimo de esforço para ler a Wiki? Ou vc nem sabe que ela existe? Lá também tem exemplos prontos pra vc estudar como funciona a função. Sabendo como funciona a função, vc pode usá-la para o propósito que vc quiser.
  13. Leu isso? Não entendi oq vc quer fazer.
  14. Cara, realmente não sei como fazer isso. Por ser iniciante, vc deveria tentar fazer coisas mais simples antes de ir para coisas complexas.
  15. Cara, isso é realmente bem complexo de ser feito. Você vai precisar obter a posição e rotação do veículo (fácil), verificar se o jogador está olhando para o veículo (fácil), verificar a distância entre vc e o veículo (fácil), verificar a rotação do jogador em relação ao veículo (difícil) [se estiver atrás do veículo, o angulo deve ser em média 180, na frente é próximo a 0 ou 360 e assim por diante], além de formatar esse ângulo relativo para não gerar valores negativos nem superiores a 360 (médio). Obtendo este ângulo relativo, vc consegue determinar qual porta do veículo o jogador está mais próximo. Para só então poder ativar/desativar o comando de pegar o escudo. Dai a parte do escudo é outra coisa mais complexa, vc vai precisar editar alguma arma para ter a aparência do escudo, já que não existe escudo nativo no GTA. A parte de colocar/tirar o escudo no jogador é fácil.
  16. Ué, como assim? Vc queria que o painel aparecesse ao entrar num marker não era? Pq vc está querendo mudar agora pra tecla específica?
  17. Nossa, que gambiarra maluca que vc fez aí. Está usando elementos GUI em painel DX, dai fica bem complicado mesmo. Eu recomendaria fazer tudo em GUI que é mais fácil. Como eu disse, os elementos DX precisam ser criados a cada frame usando o onClientRender para permanecerem na tela, pois no frame seguinte eles desaparecem. Já os elementos GUI só devem ser criados 1 vez. As funções de chamada são feitas 1 vez, vc deve mostrar o mouse 1 vez, vc deve ativar o painel 1 vez. Por isso que é mais fácil o painel GUI. Mas farei um exemplo que ativa um painel DX pelo marker: server: (exatamente igual ao exemplo anterior) theMarker = createMarker ("o marker que vc criou") addEventHandler ("onMarkerHit", theMarker, function (hitElement) if hitElement and getElementType (hitElement) == "player" then local account = getAccountName (getPlayerAccount (hitElement)) if isObjectInACLGroup ("user."..account, aclGetGroup ("NOME DA ACL GROUP PERMITIDA")) then triggerClientEvent (hitElement, "ativaPainel", hitElement) end end end) client: (aqui muda tudo) function drawDX() dxDrawRectangle(422, 221, 353, 360, tocolor(0, 0, 0, 160), false) dxDrawRectangle(422, 187, 353, 34, tocolor(0, 0, 0, 230), false) dxDrawText("Favelas da CMD", 484, 192, 765, 216, tocolor(255, 0, 0, 255), 0.80, "bankgothic", "left", "top", false, false, false, false, false) dxDrawRectangle(440, 254, 83, 31, tocolor(255, 1, 1, 255), false) --- Chapadão dxDrawRectangle(565, 254, 83, 31, tocolor(255, 1, 1, 255), false) --- Salgueiro dxDrawRectangle(677, 254, 83, 31, tocolor(255, 1, 1, 255), false) --- Penha dxDrawRectangle(440, 307, 83, 31, tocolor(255, 1, 1, 255), false) --- Abrir1 dxDrawRectangle(565, 307, 83, 31, tocolor(255, 1, 1, 255), false) --- Abrir2 dxDrawRectangle(677, 307, 83, 31, tocolor(255, 1, 1, 255), false) --- Alemão dxDrawRectangle(440, 360, 83, 31, tocolor(255, 1, 1, 255), false) --- Abrir3 dxDrawRectangle(565, 360, 83, 31, tocolor(255, 1, 1, 255), false) --- Abrir4 dxDrawRectangle(678, 360, 83, 31, tocolor(255, 1, 1, 255), false) --- Abrir5 dxDrawRectangle(565, 412, 83, 31, tocolor(255, 1, 1, 255), false) --- Abrir6 dxDrawRectangle(567, 528, 83, 31, tocolor(255, 1, 1, 255), false) --- Close dxDrawText("Chapadão", 451, 261, 496, 276, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Salgueiro", 580, 262, 629, 278, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Penha", 699, 263, 748, 279, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Breve1", 462, 314, 511, 330, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Breve2", 587, 314, 636, 330, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Alemão", 695, 315, 744, 331, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Breve3", 462, 367, 511, 383, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Breve4", 590, 368, 639, 384, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Breve5", 699, 368, 748, 384, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Breve6", 589, 419, 638, 435, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) dxDrawText("Fechar", 589, 536, 638, 552, tocolor(255, 255, 255, 255), 1.00, "default-bold", "left", "top", false, false, false, false, false) end local isDxShowing = false function gerenciaPainel () if not isDxShowing then addEventHandler ("onClientRender", getRootElement(), drawDX) showCursor (true) isDxShowing = true else removeEventHandler ("onClientRender", getRootElement(), drawDX) showCursor (false) isDxShowing = false end end addEvent ("ativaPainel", true) addEventHandler ("ativaPainel", getRootElement(), gerenciaPainel) addEventHandler ("onClientClick", getRootElement(), function (button, state, absoluteX, absoluteY) if (button == "left") and (state == "up") and isDxShowing then if absoluteX >= 567 and absoluteX <= 650 and absoluteY >= 528 and absoluteY <= 559 then -- Se a coordenada clicada estiver dentro do retângulo "Fechar", então: gerenciaPainel () -- Fecha o painel. end end end) É claro que, por se tratar de um elemento DX e não GUI, vc deve usar onClientClick e não onClientGUIClick. Obtendo a coordenada clicada e verificando se essa coordenada está dentro do botão de fechar, para executar a função de fechar o painel.
  18. No server sim. No client não. Pois o painel DX precisa ser chamado a cada frame pra se manter na tela. Dai vc precisará de uma função onClientRender pra funcionar em vez do guiSetVisible.
  19. server: theMarker = createMarker ("o marker que vc criou") addEventHandler ("onMarkerHit", theMarker, function (hitElement) if hitElement and getElementType (hitElement) == "player" then local account = getAccountName (getPlayerAccount (hitElement)) if isObjectInACLGroup ("user."..account, aclGetGroup ("NOME DA ACL GROUP PERMITIDA")) then triggerClientEvent (hitElement, "ativaPainel", hitElement) end end end) client: janelaPainel = guiCreateWindow ("crie seu painel GUI e seus elementos") guiSetVisible (janelaPainel, false) addEvent ("ativaPainel", true) addEventHandler ("ativaPainel", getRootElement(), function () guiSetVisible (janelaPainel, true) showCursor (true) end) Se tiver dúvidas quanto a sintaxe de alguma função, leia a Wiki dela.
  20. Você não deveria editar o painel admin se não tiver certeza do que está fazendo. Ele é um resource essencial para qualquer servidor. Se estragá-lo, vc perde o controle do servidor. Além disso, o painel admin precisa de várias integrações com outros resources nativos, como por exemplo o mapmanager, resourcebrowser, resourcemanager, etc. Ou seja, se vc editar o painel admin, vc deve garantir que essas integrações continuem funcionando perfeitamente. Mas caso queira mesmo fazer isso, faça o que o @DNL291 disse, use o comando /debugscript 3 e reinicie seu painel admin via comando /restart admin e nos mostre qual erro que aparece.
  21. Esses dois códigos estão no mesmo script? Se estiverem em scripts separados, os dois são server-side? Já usou /debugscript 3 pra saber qual o erro que está gerando?
  22. function PainelAbrir() if getPedOccupiedVehicle (localPlayer) then if not painel then if not fontScale then fontScale = screenW/60 end showCursor(true) painel = true addEventHandler("onClientRender", getRootElement(), PainelVeiculo) playSound("som/painel.mp3") else showCursor(false) painel = false removeEventHandler("onClientRender", getRootElement(), PainelVeiculo) end else outputChatBox ("É necessário estar em um veículo.", 255, 0, 0) end end bindKey("F5", "down", PainelAbrir)
  23. Ninguém aqui faz scripts de graça mano. Mas podemos lhe ajudar para vc mesmo arrumar seu painel. Na função que abre o painel, é só vc colocar a seguinte condição: if getPedOccupiedVehicle (thePlayer) then É claro que, depende muito de como é o código do seu painel. Seria mais fácil se vc postasse pelo menos só a parte do código que abre o painel para verificarmos.
  24. É que foi assim que ele pediu no início, lá naquele outro tópico. Mas já editei minha versão aqui, que agora mostra o nick dos jogadores online e já sem os códigos de cores em vez do nome da conta. No caso só aparece eu pois só tem eu no server local, meu nick é ##00bfffLord, que sem os códigos de cores é #Lord. http://prntscr.com/jfvvpw
  25. Hum... mostrar os nomes dos jogadores em vez dos nomes das contas eu acho melhor. Assim fica mais fácil saber quem está "melhor" e quem está "pior" do que vc no ranking. Até pq os jogadores geralmente não sabem os logins dos outros. Só quem sabe é Staff.
×
×
  • Create New...