#Gubiani Posted May 10, 2017 Share Posted May 10, 2017 O que há de errado? Objetivo: o jogador que estiver no grupo acl "EB" tem acesso ao comando /skin que por sua função tem de setar a skin do jogador para a skin 287, caso contrário aparece uma mensagem para ele dizendo que apenas membros do exercito podem executar o comando. Quem poder me ajudar fico grato, sou novato em desenvolver scripts mas ja tenho uma noção, pois, eu edito bastante scripts por ai. Ah eu gostaria que no outputChatBox("") o comando da cor #FF0000 funcionasse. Obrigado. function darSkin( thePlayer ) local nomeAcc = getAccountName(getPlayerAccount(thePlayer)) if not isObjectInACLGroup("user."..nomeAcc, aclGetGroup("EB")) then outputChatBox("Somente membros do Exercito Brasileiro podem pegar a skin!") else setPlayerSkin(thePlayer, 287) end addCommandHandler("skin", darSkin) Link to comment
Pedro861 Posted May 10, 2017 Share Posted May 10, 2017 (edited) addCommandHandler("skin", function() for i, thePlayer in ipairs(getElementsByType("player")) do if isObjectInACLGroup ( "user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup ( "Admin" )) then setPlayerSkin(thePlayer, 287) --outputChatBox ( "Você pegou a skin do Exercito Brasileiro!", thePlayer, 255, 255, 255, true ) else outputChatBox ( "Somente membros do Exercito Brasileiro podem pegar a skin!", thePlayer, 255, 0, 0, true ) end end end) Edited May 10, 2017 by Pedro861 1 Link to comment
DNL291 Posted May 10, 2017 Share Posted May 10, 2017 O que impede o seu código de funcionar é a falta de um 'end', que fecha a condição na linha 3. Pra ativar estas cores: #FF0000, use true no 4º argumento de outputChatBox: outputChatBox("#ff0000texto", thePlayer, 255,255,255, true) Como você pode ver, onde está thePlayer, é o jogador pra quem a msg do chat vai mostrar, depois as cores R,G,B do texto e o 4º argumento é o que habilita o uso das cores hex. Outra coisa a esclarecer, setPlayerSkin é uma função antiga que não é mais usada - use está função: setElementModel. Fica assim: function darSkin( thePlayer ) local nomeAcc = getAccountName(getPlayerAccount(thePlayer)) if not isObjectInACLGroup("user."..nomeAcc, aclGetGroup("EB")) then outputChatBox("#ff0000Somente membros do Exercito Brasileiro podem pegar a skin!", thePlayer, 255,255,255, true) else setElementModel(thePlayer, 287) end end addCommandHandler("skin", darSkin) 1 Link to comment
Other Languages Moderators Lord Henry Posted May 10, 2017 Other Languages Moderators Share Posted May 10, 2017 (edited) 12 hours ago, Pedro861 said: addCommandHandler("skin", function() for i, thePlayer in ipairs(getElementsByType("player")) do if isObjectInACLGroup ( "user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup ( "Admin" )) then setPlayerSkin(thePlayer, 287) --outputChatBox ( "Você pegou a skin do Exercito Brasileiro!", thePlayer, 255, 255, 255, true ) else outputChatBox ( "Somente membros do Exercito Brasileiro podem pegar a skin!", thePlayer, 255, 0, 0, true ) end end end) @Pedro861, ele quer setar a skin somente em quem usar o comando /skin, no caso ele mesmo. Desse jeito que vc colocou vai setar a skin em todo mundo que for Admin. Do jeito que o @DNL291 fez é o correto, se o jogador que usar o comando não for do EB, mostra a mensagem de erro em vermelho. Caso contrario, seta a skin nele. Outro jeito de fazer, que no fim das contas é a mesma coisa, pode ser assim: function darSkin (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) --Variável 'nomeAcc' recebe a conta de quem executou o comando. (no caso, a sua conta) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then --Se o jogador que executou o comando estiver na ACL "EB", faz o seguinte: setElementModel (thePlayer, 287) --Coloca skin 287 nele. else --Se não estiver na ACL "EB", faz o seguinte: outputChatBox ("Somente membros do #00BB00Exercito Brasileiro#FF0000 podem pegar a skin!", thePlayer, 255, 0, 0, true) --Manda isso em vermelho, onde "Exército Brasileiro" fica em verde e o resto vermelho. Manda isso somente para quem executou o comando. end --Finaliza o If e o Else. end --Finaliza a função darSkin. addCommandHandler ("skin", darSkin) --Executa essa função quando alguém usa o comando /skin. Qualquer dúvida, volte a perguntar. Boa sorte. Edited May 10, 2017 by Lord Henry 2 1 Link to comment
#Gubiani Posted May 10, 2017 Author Share Posted May 10, 2017 Muito obrigado a todos! Como eu sou novo em script o que vocês me recomenda aprender primeiro de tudo? Para eu começar uma linha de estudos, sem se perder ou pular alguma função? Link to comment
DNL291 Posted May 10, 2017 Share Posted May 10, 2017 (edited) Dominar códigos como o postado neste tópico é um bom começo. Só nessas 9 linhas, você já vai ter uma noção do que é uma condição if ... then, saber usar outputChatBox, fazer códigos de comandos e restringir ações apenas admins. sabendo fazer o básico, o resto é você quem decide: aprender mais sobre tabelas, desenvolver usando GUIs ou DXs e olhar outros códigos pra ver como tudo é feito. Você pode sempre ter boa ajuda aqui no fórum quando tiver dificuldade ou alguma dúvida. É lógico que lendo tutoriais e ao mesmo tempo fazendo na prática - um complementa o outro. Com o tempo, você vai saber de cór boa parte das funções do MTA, é natural isso exigir tempo. Então te aconselho focar em outras coisas e não olhar função por função. Edited May 10, 2017 by DNL291 1 Link to comment
#Gubiani Posted May 11, 2017 Author Share Posted May 11, 2017 (edited) Bom, eu fiz o esquema em que vocês explicaram a cima, porém, eu tirei o outputChatBox no else e criei outra função para outro grupo da ACL que seria a Yakuza, porém, só está funcionando a função do exército. Como eu posso arrumar que os dois funcionam? E futuramente adicionar mais grupos abaixo? function darSkin (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) else end end addCommandHandler ("skin", darSkin) function darSkin2(thePlayer) local nomeAcc = getAccountName (getPlayerAccount(thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclgetGroup("YKZ")) then setElementModel (thePlayer, 140) else end end addCommandHandler ("skin", darSkin2) Edited May 11, 2017 by #Gubiani Link to comment
Other Languages Moderators Lord Henry Posted May 11, 2017 Other Languages Moderators Share Posted May 11, 2017 (edited) 9 hours ago, #Gubiani said: Bom, eu fiz o esquema em que vocês explicaram a cima, porém, eu tirei o outputChatBox no else e criei outra função para outro grupo da ACL que seria a Yakuza, porém, só está funcionando a função do exército. Como eu posso arrumar que os dois funcionam? E futuramente adicionar mais grupos abaixo? function darSkin (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) else end end addCommandHandler ("skin", darSkin) function darSkin2(thePlayer) local nomeAcc = getAccountName (getPlayerAccount(thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclgetGroup("YKZ")) then setElementModel (thePlayer, 140) else end end addCommandHandler ("skin", darSkin2) Não é recomendável vc colocar o mesmo comando para funções diferentes. O ideal é vc colocar os dois na mesma função. function darSkin (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) elseif isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("YKZ")) then setElementModel (thePlayer, 140) end end addCommandHandler ("skin", darSkin) Obs: Se o jogador estiver nas duas ACLs ao mesmo tempo, ele vai colocar a skin do EB, pois é a condição que ele vai entrar primeiro. Ao entrar em um IF, ele não vai entrar em um ELSE, mesmo se a condição dele também for verdadeira. Edited May 11, 2017 by Lord Henry 1 Link to comment
Other Languages Moderators Lord Henry Posted May 11, 2017 Other Languages Moderators Share Posted May 11, 2017 Se você for permitir que os membros fiquem em diferentes facções ao mesmo tempo, você vai precisar de algum sistema onde o jogador decida qual skin deseja pegar. Por exemplo: O jogador está no Exército e na Yakuza ao mesmo tempo. (EB e YKZ). Ele quer ter acesso às duas skins, mas ao executar o comando /skin, ele só recebe do exército mas queria poder receber da Yakuza também. Para resolver esse problema, será necessário que o jogador informe de alguma maneira ao resource, qual das skins ele quer pegar. Existem dois jeitos diferentes, a primeira é a mais simples, onde vc faz um comando diferente para cada skin. function darSkinEB (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) else outputChatBox ("Você não tem permissão para usar a skin do #00BB00Exército.", thePlayer, 255, 0, 0, true) end end addCommandHandler ("skineb", darSkinEB) function darSkinYKZ (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("YKZ")) then setElementModel (thePlayer, 140) else outputChatBox ("Você não tem permissão para usar a skin da #BB0000Yakuza.", thePlayer, 255, 0, 0, true) end end addCommandHandler ("skinykz", darSkinYKZ) Outro jeito, um pouco mais complexo porém mais leve do que criar várias funções, é você criar um parâmetro junto ao comando. Este parâmetro informará ao script qual a skin que o jogador quer pegar. Exemplo: "/skin exercito" ou "/skin yakuza" function darSkin (thePlayer, commandName, faction) -- Função geral, o faction é o que o jogador vai informar após o comando. local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if faction == "exercito" then -- Se o jogador der o comando "/skin exercito", faz o seguinte: if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) else outputChatBox ("Você não tem permissão para usar a skin do #00BB00Exército.", thePlayer, 255, 0, 0, true) end elseif faction == "yakuza" then -- Se o jogador der o comando "/skin yakuza", faz o seguinte: if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("YKZ")) then setElementModel (thePlayer, 140) else outputChatBox ("Você não tem permissão para usar a skin da #BB0000Yakuza.", thePlayer, 255, 0, 0, true) end elseif faction == nil then -- Se o jogador der o comando "/skin", faz o seguinte: outputChatBox ("Erro de sintaxe, use /skin <nome da facção>", thePlayer) else -- Se o jogador der o comando "/skin" seguido de qualquer coisa que não esteja programada aqui, faz o seguinte: outputChatBox ("Erro: Não existe skin dessa facção.", thePlayer) end end addCommandHandler ("skin", darSkin, false, false) --Esse penúltimo false indica que o comando não é restrito. O último false indica que o comando não diferencia maiúsculas de minúsculas. Ou seja, se ele usar /SkIN EXerciTO, vai funcionar mesmo assim. Espero ter ajudado. Caso possua mais dúvidas, estamos aqui para ajudar. 1 Link to comment
#Gubiani Posted May 12, 2017 Author Share Posted May 12, 2017 10 hours ago, Lord Henry said: Se você for permitir que os membros fiquem em diferentes facções ao mesmo tempo, você vai precisar de algum sistema onde o jogador decida qual skin deseja pegar. Por exemplo: O jogador está no Exército e na Yakuza ao mesmo tempo. (EB e YKZ). Ele quer ter acesso às duas skins, mas ao executar o comando /skin, ele só recebe do exército mas queria poder receber da Yakuza também. Para resolver esse problema, será necessário que o jogador informe de alguma maneira ao resource, qual das skins ele quer pegar. Existem dois jeitos diferentes, a primeira é a mais simples, onde vc faz um comando diferente para cada skin. function darSkinEB (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) else outputChatBox ("Você não tem permissão para usar a skin do #00BB00Exército.", thePlayer, 255, 0, 0, true) end end addCommandHandler ("skineb", darSkinEB) function darSkinYKZ (thePlayer) local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("YKZ")) then setElementModel (thePlayer, 140) else outputChatBox ("Você não tem permissão para usar a skin da #BB0000Yakuza.", thePlayer, 255, 0, 0, true) end end addCommandHandler ("skinykz", darSkinYKZ) Outro jeito, um pouco mais complexo porém mais leve do que criar várias funções, é você criar um parâmetro junto ao comando. Este parâmetro informará ao script qual a skin que o jogador quer pegar. Exemplo: "/skin exercito" ou "/skin yakuza" function darSkin (thePlayer, commandName, faction) -- Função geral, o faction é o que o jogador vai informar após o comando. local nomeAcc = getAccountName (getPlayerAccount (thePlayer)) if faction == "exercito" then -- Se o jogador der o comando "/skin exercito", faz o seguinte: if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("EB")) then setElementModel (thePlayer, 287) else outputChatBox ("Você não tem permissão para usar a skin do #00BB00Exército.", thePlayer, 255, 0, 0, true) end elseif faction == "yakuza" then -- Se o jogador der o comando "/skin yakuza", faz o seguinte: if isObjectInACLGroup ("user."..nomeAcc, aclGetGroup("YKZ")) then setElementModel (thePlayer, 140) else outputChatBox ("Você não tem permissão para usar a skin da #BB0000Yakuza.", thePlayer, 255, 0, 0, true) end elseif faction == nil then -- Se o jogador der o comando "/skin", faz o seguinte: outputChatBox ("Erro de sintaxe, use /skin <nome da facção>", thePlayer) else -- Se o jogador der o comando "/skin" seguido de qualquer coisa que não esteja programada aqui, faz o seguinte: outputChatBox ("Erro: Não existe skin dessa facção.", thePlayer) end end addCommandHandler ("skin", darSkin, false, false) --Esse penúltimo false indica que o comando não é restrito. O último false indica que o comando não diferencia maiúsculas de minúsculas. Ou seja, se ele usar /SkIN EXerciTO, vai funcionar mesmo assim. Espero ter ajudado. Caso possua mais dúvidas, estamos aqui para ajudar. Muito obrigado, gostei mais dessa função mais complexa. Tenho uma duvida por exemplo: function exemplo (thePlayer) no caso esse thePlayer é uma variável padrão da programação do game ou eu posso usar Jogador ou qualquer outra coisa? tem casos que eu já vi que tem em vez de thePlayer ter source, se tiver como me explicar como funciona isso eu agradeço desde já. Link to comment
DNL291 Posted May 12, 2017 Share Posted May 12, 2017 É um parâmetro da função, significa que a nomeação fica por sua conta; Você pode usar: thePlayer, sourcePlayer, player; qualquer texto/palavra vai funcionar. E o retorno será sempre definido pela função, sem que seja possível você trocar o 1º argumento pelo segundo. Assim como o nome da função, que você pode escrever qualquer um. 1 Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 Olá boa noite, estou com uma dúvida sobre um script que peguei aqui na comunidade do MTA esse script muda o respawn do player para determinado ACL por exemplo eu sou do exército e acabo morrendo e eu respawno na base. Até por ai tudo bem, bom como todos devem saber o grupo chamado "Everyone" seria todos os players, certo só que o player que está fazendo download ele não respawna em nenhum lugar, quando morre ele simplesmente fica bugado no chão e a camera dele fica infinitamente subindo, só relogando do servidor para tirar este bug, e aí que entra minha dúvida. Como eu faço para adicionar os players "guest" para respawna em tal coordenada quando morre? Segue abaixo o script usado. addEventHandler( "onResourceStart", resourceRoot, function() resetMapInfo() for _,player in ipairs( getElementsByType 'player' ) do spawn( player ) end end ) function spawn( player ) if not isElement( player ) then return end showChat( player, true ) local acc = getPlayerAccount( player ) if acc and not isGuestAccount( acc ) then if isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "YKZ" ) ) then spawnPlayer ( player, 2340.81323, 553.25513, 18.75537, 90, 120) elseif isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "EB" ) ) then spawnPlayer ( player, 205.75940, 1866.97839, 13.14063, 90, 287) elseif isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "Everyone" ) ) then spawnPlayer ( player, 1177.12634, -1327.09448, 14.05530, 90, 0) end end fadeCamera( player, true ) setCameraTarget( player, player ) end addEventHandler( "onPlayerJoin", root, function( ) spawn( source ) end) addEventHandler( "onPlayerWasted", root, function( ) setTimer( spawn, 500, 1, source ) end) Link to comment
Other Languages Moderators Lord Henry Posted May 13, 2017 Other Languages Moderators Share Posted May 13, 2017 (edited) Use isso: elseif isGuestAccount (getPlayerAccount (player)) then spawnPlayer (player, 1177.12634, -1327.09448, 14.05530, 90, 0) end Seria melhor vc criar outro tópico quando for fazer uma pergunta sem relação com este tópico. Edited May 13, 2017 by Lord Henry 1 Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 Obrigado, desculpe não sabia mas agora vou tomar cuidado! Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 (edited) addEventHandler( "onResourceStart", resourceRoot, function() resetMapInfo() for _,player in ipairs( getElementsByType 'player' ) do spawn( player ) end end ) function spawn( player ) if not isElement( player ) then return end showChat( player, true ) local acc = getPlayerAccount( player ) if acc and not isGuestAccount( acc ) then if isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "YKZ" ) ) then spawnPlayer ( player, 2340.81323, 553.25513, 18.75537, 90, 120) elseif isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "EB" ) ) then spawnPlayer ( player, 205.75940, 1866.97839, 13.14063, 90, 287) elseif isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "Everyone" ) ) then spawnPlayer ( player, 1177.12634, -1327.09448, 14.05530, 90, 0) elseif isGuestAccount (getPlayerAccount (player)) then spawnPlayer (player, 1177.12634, -1327.09448, 14.05530, 90, 0) end end fadeCamera( player, true ) setCameraTarget( player, player ) end addEventHandler( "onPlayerJoin", root, function( ) spawn( source ) end) addEventHandler( "onPlayerWasted", root, function( ) setTimer( spawn, 500, 1, source ) end) Eu fiz como você pediu, mas não funcionou... Edited May 13, 2017 by #Gubiani Link to comment
DNL291 Posted May 13, 2017 Share Posted May 13, 2017 Remova not isGuestAccount( acc ) da condição na linha 14. Tente: function spawn( player ) if not isElement( player ) then return end showChat( player, true ) local acc = getPlayerAccount( player ) if acc then if isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "YKZ" ) ) then spawnPlayer ( player, 2340.81323, 553.25513, 18.75537, 90, 120) elseif isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "EB" ) ) then spawnPlayer ( player, 205.75940, 1866.97839, 13.14063, 90, 287) else spawnPlayer (player, 1177.12634, -1327.09448, 14.05530, 90, 0) end end fadeCamera( player, true ) setCameraTarget( player, player ) end 1 Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 Ok, obrigado vou testar Bom, fiz o teste tirei a condição da linha 14, e agora até mesmo quem está logado em alguma conta fica bugado. Ah eu esqueci de por " if acc then " Link to comment
Other Languages Moderators Lord Henry Posted May 13, 2017 Other Languages Moderators Share Posted May 13, 2017 (edited) Eu não entendi a necessidade dessa condição: if acc then Edited May 13, 2017 by Lord Henry 1 Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 Olha só quando eu não coloquei o " if acc then " bugou até para quem está logado, porém, quando eu coloquei funcionou. Até para os usuarios em /logout (guest) Muito obrigado. Link to comment
DNL291 Posted May 13, 2017 Share Posted May 13, 2017 Just now, Lord Henry said: Eu não entendi a necessidade dessa condição: if acc then Na verdade nem precisa . Mas num caso de um elemento não-jogador ser passado, esse trecho do código não seria afetado por conta dessa checagem. 1 Link to comment
Other Languages Moderators Lord Henry Posted May 13, 2017 Other Languages Moderators Share Posted May 13, 2017 Por isso que não entendi, pois já existe isso para fazer a verificação: if not isElement( player ) then return end Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 Pessoal, tem algum problema se deixar o gamemode desligado, no caso o gamemode play, tive que desligar para funcionar esse script de respawn por ACL, se eu deixar o gamemode play ligado ele da respawn padrão do gamemode. Link to comment
Other Languages Moderators Lord Henry Posted May 13, 2017 Other Languages Moderators Share Posted May 13, 2017 Just now, #Gubiani said: Pessoal, tem algum problema se deixar o gamemode desligado, no caso o gamemode play, tive que desligar para funcionar esse script de respawn por ACL, se eu deixar o gamemode play ligado ele da respawn padrão do gamemode. Não há problema em desligá-lo. Mas esteja ciente de manter ele desligado nas configurações do server. Senão toda vez que vc for ligar o server, ele vai ligar o Gamemode 'Play' novamente. Link to comment
#Gubiani Posted May 13, 2017 Author Share Posted May 13, 2017 Sim, eu deixei o autorun em false pela mtaserver. Link to comment
Other Languages Moderators Lord Henry Posted May 13, 2017 Other Languages Moderators Share Posted May 13, 2017 (edited) A propósito, eu fiz assim e funcionou normal aqui. function spawn( player ) if not isElement( player ) then return end showChat( player, true ) local acc = getPlayerAccount( player ) if isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "YKZ" ) ) then spawnPlayer ( player, 2340.81323, 553.25513, 18.75537, 90, 120) elseif isObjectInACLGroup ( "user.".. getAccountName( acc ), aclGetGroup ( "EB" ) ) then spawnPlayer ( player, 205.75940, 1866.97839, 13.14063, 90, 287) else spawnPlayer (player, 1177.12634, -1327.09448, 14.05530, 90, 0) end end Edited May 13, 2017 by Lord Henry Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now