#Gubiani

Preciso de ajuda neste script (sou novato)

Recommended Posts

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)

Share this post


Link to post
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 by Pedro861
  • Like 1

Share this post


Link to post

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)

 

  • Like 1

Share this post


Link to post
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 by Lord Henry
  • Like 2

Share this post


Link to post

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?

Share this post


Link to post

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 by DNL291
  • Like 1

Share this post


Link to post

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 by #Gubiani

Share this post


Link to post
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 by Lord Henry
  • Like 1

Share this post


Link to post

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.

  • Like 1

Share this post


Link to post
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á.

Share this post


Link to post

É 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.

  • Like 1

Share this post


Link to post

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)

 

Share this post


Link to post
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 by #Gubiani

Share this post


Link to post

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

 

  • Like 1

Share this post


Link to post

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 "

Share this post


Link to post

Eu não entendi a necessidade dessa condição:

if acc then

 

Edited by Lord Henry
  • Like 1

Share this post


Link to post

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.

Share this post


Link to post
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.

  • Like 1

Share this post


Link to post

Por isso que não entendi, pois já existe isso para fazer a verificação:

if not isElement( player ) then return end

 

Share this post


Link to post

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.

Share this post


Link to post
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.

Share this post


Link to post

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 by Lord Henry

Share this post


Link to post

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.