Jump to content

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)
Link to comment
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
Link to comment
  • Moderators

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
Link to comment
  • Other Languages Moderators
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
  • Thanks 1
Link to comment
  • Moderators

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
Link to comment

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
Link to comment
  • Other Languages Moderators
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
Link to comment
  • Other Languages Moderators

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
Link to comment
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
  • Moderators

É 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
Link to comment

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
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
Link to comment
  • Moderators

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
Link to comment
  • Moderators
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
Link to comment
  • Other Languages Moderators
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
  • Other Languages Moderators

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
Link to comment

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...