Jump to content

Anti-Bind


Recommended Posts

  • Other Languages Moderators

Bom, nunca fiz bloqueio de teclas então passei metade do dia aprendendo a fazer isso.

Consegui fazer ele detectar as teclas que possuem bind de texto e bloquear seu uso caso o jogador não tenha permissão. Você me pediu por privado para fazer via ACL Group, então fiz o bloqueio usando a ACL Group Console como exemplo. Se o jogador não estiver na ACL Group Console, o script bloqueará qualquer bind de texto dele. A parte do bloqueio de binds é feita client-side e a parte de verificar ACL Group é server-side.

Server:

addEventHandler ("onResourceStart", getResourceRootElement(getThisResource()), function () -- Executa essa função ao iniciar este resource.
	local everybody = getElementsByType ("player") -- everybody é uma lista com todos os players conectados no servidor, incluindo os deslogados.
	for i, thePlayer in ipairs (everybody) do -- Para cada jogador que já está no servidor, faça:
		if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Console")) then -- Se este jogador está na ACL Group Console, então:
			setElementData (thePlayer, "bindPermission", true) -- Permite que este player use teclas com binds de texto.
		else -- Se ele não está na ACL Group Console, então:
			setElementData (thePlayer, "bindPermission", false) -- Proíbe que este player use teclas com binds de texto.
		end
	end
end)

addEventHandler ("onPlayerLogin", getRootElement(), function (prev, curr) -- Quando alguém fizer login, executa essa função.
	if isObjectInACLGroup ("user."..getAccountName(curr), aclGetGroup("Console")) then -- Se o jogador que fez login está na ACL Group Console, então:
		setElementData (source, "bindPermission", true) -- Permite que este player use teclas com binds de texto.
	end
end)

addEventHandler ("onPlayerLogout", getRootElement(), function (prev, curr) -- Quando alguém deslogar, executa essa função.
	setElementData (source, "bindPermission", false) -- Proíbe que o player deslogado use teclas com binds de texto.
end)

Client:

addEventHandler ("onClientKey", getRootElement(), function (button, state) -- Executa essa função quando o jogador pressionar ou soltar qualquer tecla.
	if not state then return end -- Não verifica ao soltar a tecla, somente ao pressionar.
	if not getElementData (localPlayer, "bindPermission") then -- Se o jogador não tem permissão para usar binds de texto, então:
		local keys = getBoundKeys ("say") -- Obtém uma lista com todas as teclas com binds de texto.
		if keys then -- Se existe alguma tecla com bind de texto, então:
			for keyName, keyState in pairs (keys) do -- Para cada tecla com bind de texto, faça:
				if button == keyName then -- Se a tecla pressionada está com bind de texto, então:
					outputChatBox ("Tecla bloqueada: "..keyName, 255, 0, 0) -- Avisa o jogador que essa tecla foi bloqueada.
					cancelEvent () -- Cancela o efeito dessa tecla como se ela nem tivesse sido usada.
					break -- Sai do loop do FOR para não precisar verificar as demais teclas com bind de texto.
				end
			end
		end
	end
end)

Espero ter ajudado.

  • Thanks 1
Link to comment
6 hours ago, Lord Henry said:

Bom, nunca fiz bloqueio de teclas então passei metade do dia aprendendo a fazer isso.

Consegui fazer ele detectar as teclas que possuem bind de texto e bloquear seu uso caso o jogador não tenha permissão. Você me pediu por privado para fazer via ACL Group, então fiz o bloqueio usando a ACL Group Console como exemplo. Se o jogador não estiver na ACL Group Console, o script bloqueará qualquer bind de texto dele. A parte do bloqueio de binds é feita client-side e a parte de verificar ACL Group é server-side.

Server:


addEventHandler ("onResourceStart", getResourceRootElement(getThisResource()), function () -- Executa essa função ao iniciar este resource.
	local everybody = getElementsByType ("player") -- everybody é uma lista com todos os players conectados no servidor, incluindo os deslogados.
	for i, thePlayer in ipairs (everybody) do -- Para cada jogador que já está no servidor, faça:
		if isObjectInACLGroup ("user."..getAccountName(getPlayerAccount(thePlayer)), aclGetGroup("Console")) then -- Se este jogador está na ACL Group Console, então:
			setElementData (thePlayer, "bindPermission", true) -- Permite que este player use teclas com binds de texto.
		else -- Se ele não está na ACL Group Console, então:
			setElementData (thePlayer, "bindPermission", false) -- Proíbe que este player use teclas com binds de texto.
		end
	end
end)

addEventHandler ("onPlayerLogin", getRootElement(), function (prev, curr) -- Quando alguém fizer login, executa essa função.
	if isObjectInACLGroup ("user."..getAccountName(curr), aclGetGroup("Console")) then -- Se o jogador que fez login está na ACL Group Console, então:
		setElementData (source, "bindPermission", true) -- Permite que este player use teclas com binds de texto.
	end
end)

addEventHandler ("onPlayerLogout", getRootElement(), function (prev, curr) -- Quando alguém deslogar, executa essa função.
	setElementData (source, "bindPermission", false) -- Proíbe que o player deslogado use teclas com binds de texto.
end)

Client:


addEventHandler ("onClientKey", getRootElement(), function (button, state) -- Executa essa função quando o jogador pressionar ou soltar qualquer tecla.
	if not state then return end -- Não verifica ao soltar a tecla, somente ao pressionar.
	if not getElementData (localPlayer, "bindPermission") then -- Se o jogador não tem permissão para usar binds de texto, então:
		local keys = getBoundKeys ("say") -- Obtém uma lista com todas as teclas com binds de texto.
		if keys then -- Se existe alguma tecla com bind de texto, então:
			for keyName, keyState in pairs (keys) do -- Para cada tecla com bind de texto, faça:
				if button == keyName then -- Se a tecla pressionada está com bind de texto, então:
					outputChatBox ("Tecla bloqueada: "..keyName, 255, 0, 0) -- Avisa o jogador que essa tecla foi bloqueada.
					cancelEvent () -- Cancela o efeito dessa tecla como se ela nem tivesse sido usada.
					break -- Sai do loop do FOR para não precisar verificar as demais teclas com bind de texto.
				
			
		
	

Espero ter ajudado.

Vlw amigo.

Link to comment
14 hours ago, Lord Henry said:

Quais erros?

Não deu erro nenhum aqui. Tem certeza que copiou corretamente o código?

Eu testei o script e esta funcionando perfeitamente, bom queria aproveitar aqui este exemplo de bind de texto, se não for muito incomodo, teria como fazer um exemplo para bloquear as teclas que o jogador aperta por exemplo uma combinação: 

Se o jogador segurar o w, espaço e o mouse2 ao mesmo tempo ele é kikado motivo: Uso de combinações bloqueadas! se der pra fazer um exemplo com essas 3 teclas ficarei grato !

OBS: Após ele ser kikado manda uma mensagem root avisando: Jogador Lord kikado por combinações de tecla bloqueada: w, espaço , mouse2, em relação ao bloqueio de texto, teria como verificar se o jogador tiver bind's em outro chat? por exemplo: Eu uso um chat separadamente para os administradores, ele não usa a mesma variavel '' say '' !

 

EDIT: Neste caso que eu pedi, você não precisa usar nem uma verificação ao lado client sobre acl, quero que ninguém possa usar essa combinação de tecla ! 

Edited by OverKILL
Link to comment
  • Other Languages Moderators
3 hours ago, OverKILL said:

Se o jogador segurar o w, espaço e o mouse2 ao mesmo tempo ele é kikado motivo: Uso de combinações bloqueadas! se der pra fazer um exemplo com essas 3 teclas ficarei grato !

Você pode fazer da mesma forma com onClientKey. Quando o jogador pressiona uma das 3 teclas, seta uma data true nele com setElementData, quando ele solta essa tecla, seta a data false. Se ele estiver com as 3 datas como true, kicka ele. Cada tecla pressionada seta uma data diferente.

Obs: Precisará usar um triggerServerEvent para poder kickar o jogador, pois a função de kick é server-side somente. Não se esqueça de dar permissão Admin para o resource.

client-side

function keyCombination (button, state)
	if button == "w" then
		if state then -- Se o jogador aperta o botão W, então:
			setElementData (localPlayer, "button.w", true) -- Seta essa data nele.
		else -- Se o jogador solta o botão W, então:
			setElementData (localPlayer, "button.w", false) -- Remove essa data dele.
		end
	elseif button == "space" then -- Mesma coisa com os demais botões da combinação.
		if state then
			setElementData (localPlayer, "button.space", true)
		else
			setElementData (localPlayer, "button.space", false)
		end
	elseif button == "mouse2" then
		if state then
			setElementData (localPlayer, "button.mouse2", true)
		else
			setElementData (localPlayer, "button.mouse2", false)
		end
	end
	-- Se todos os 3 botões estiverem apertados, então:
	if getElementData (localPlayer, "button.w") and getElementData (localPlayer, "button.space") and getElementData (localPlayer, "button.mouse2") then
		triggerServerEvent ("keyComboKick", localPlayer) -- Executa a função do server.lua que irá kickar o localPlayer.
	end
end
addEventHandler ("onClientKey", getRootElement(), keyCombination)

server-side

function comboKick ()
	outputChatBox (getPlayerName (client).."#FF0000 foi kickado do servidor. (Motivo: Uso de combinação proibida de teclas: W + Space + Mouse2)", root, 255, 255, 255, true)
	kickPlayer (client, "Uso de combinação proibida de teclas")
end
addEvent ("keyComboKick", true)
addEventHandler ("keyComboKick", getRootElement(), comboKick)

 

3 hours ago, OverKILL said:

em relação ao bloqueio de texto, teria como verificar se o jogador tiver bind's em outro chat? por exemplo: Eu uso um chat separadamente para os administradores, ele não usa a mesma variavel '' say '' !

É só substituir o "say" pelo comando utilizado pelo seu chat admin. Por exemplo se você usa "/admchat Texto" para mandar "Texto" para os admins, então só vc trocar o "say" pelo "admchat".

Quando vc usa a tecla T e manda uma mensagem, você está na verdade usando o comando /say.

On 18/08/2018 at 15:29, Lord Henry said:

[...]

Client:


addEventHandler ("onClientKey", getRootElement(), function (button, state)
	if not state then return end
	if not getElementData (localPlayer, "bindPermission") then
		local keys = getBoundKeys ("seuComandoAqui") -- Obtém uma lista com todas as teclas com binds deste comando.
		if keys then
			for keyName, keyState in pairs (keys) do
				if button == keyName then
					outputChatBox ("Tecla bloqueada: "..keyName, 255, 0, 0)
					cancelEvent ()
					break
				end
			end
		end
	end
end)

Espero ter ajudado.

 

  • Like 1
Link to comment
6 minutes ago, Lord Henry said:

Você pode fazer da mesma forma com onClientKey. Quando o jogador pressiona uma das 3 teclas, seta uma data true nele com setElementData, quando ele solta essa tecla, seta a data false. Se ele estiver com as 3 datas como true, kicka ele. Cada tecla pressionada seta uma data diferente.

Obs: Precisará usar um triggerServerEvent para poder kickar o jogador, pois a função de kick é server-side somente. Não se esqueça de dar permissão Admin para o resource.

client-side


function keyCombination (button, state)
	if button == "w" then
		if state then -- Se o jogador aperta o botão W, então:
			setElementData (localPlayer, "button.w", true) -- Seta essa data nele.
		else -- Se o jogador solta o botão W, então:
			setElementData (localPlayer, "button.w", false) -- Remove essa data dele.
		end
	elseif button == "space" then -- Mesma coisa com os demais botões da combinação.
		if state then
			setElementData (localPlayer, "button.space", true)
		else
			setElementData (localPlayer, "button.space", false)
		end
	elseif button == "mouse2" then
		if state then
			setElementData (localPlayer, "button.mouse2", true)
		else
			setElementData (localPlayer, "button.mouse2", false)
		end
	end
	-- Se todos os 3 botões estiverem apertados, então:
	if getElementData (localPlayer, "button.w") and getElementData (localPlayer, "button.space") and getElementData (localPlayer, "button.mouse2") then
		triggerServerEvent ("keyComboKick", localPlayer) -- Executa a função do server.lua que irá kickar o localPlayer.
	end
end
addEventHandler ("onClientKey", getRootElement(), keyCombination)

server-side


function comboKick ()
	outputChatBox (getPlayerName (client).."#FF0000 foi kickado do servidor. (Motivo: Uso de combinação proibida de teclas: W + Space + Mouse2)", root, 255, 255, 255, true)
	kickPlayer (client, "Uso de combinação proibida de teclas")
end
addEvent ("keyComboKick", true)
addEventHandler ("keyComboKick", getRootElement(), comboKick)

 

É só substituir o "say" pelo comando utilizado pelo seu chat admin. Por exemplo se você usa "/admchat Texto" para mandar "Texto" para os admins, então só vc trocar o "say" pelo "admchat".

Quando vc usa a tecla T e manda uma mensagem, você está na verdade usando o comando /say.

 

Em relação a esta parte do script de bloquear o texto:

local keys = getBoundKeys ("seuComandoAqui") -- Obtém uma lista com todas as teclas com binds deste comando.

Tem como eu adicionar por exemplo 1 ou mais comandos nesta mesma função? para bloquear? por exemplo: say, Chat

Link to comment
52 minutes ago, Lord Henry said:

Você pode fazer da mesma forma com onClientKey. Quando o jogador pressiona uma das 3 teclas, seta uma data true nele com setElementData, quando ele solta essa tecla, seta a data false. Se ele estiver com as 3 datas como true, kicka ele. Cada tecla pressionada seta uma data diferente.

Obs: Precisará usar um triggerServerEvent para poder kickar o jogador, pois a função de kick é server-side somente. Não se esqueça de dar permissão Admin para o resource.

client-side


function keyCombination (button, state)
	if button == "w" then
		if state then -- Se o jogador aperta o botão W, então:
			setElementData (localPlayer, "button.w", true) -- Seta essa data nele.
		else -- Se o jogador solta o botão W, então:
			setElementData (localPlayer, "button.w", false) -- Remove essa data dele.
		end
	elseif button == "space" then -- Mesma coisa com os demais botões da combinação.
		if state then
			setElementData (localPlayer, "button.space", true)
		else
			setElementData (localPlayer, "button.space", false)
		end
	elseif button == "mouse2" then
		if state then
			setElementData (localPlayer, "button.mouse2", true)
		else
			setElementData (localPlayer, "button.mouse2", false)
		end
	end
	-- Se todos os 3 botões estiverem apertados, então:
	if getElementData (localPlayer, "button.w") and getElementData (localPlayer, "button.space") and getElementData (localPlayer, "button.mouse2") then
		triggerServerEvent ("keyComboKick", localPlayer) -- Executa a função do server.lua que irá kickar o localPlayer.
	end
end
addEventHandler ("onClientKey", getRootElement(), keyCombination)

server-side


function comboKick ()
	outputChatBox (getPlayerName (client).."#FF0000 foi kickado do servidor. (Motivo: Uso de combinação proibida de teclas: W + Space + Mouse2)", root, 255, 255, 255, true)
	kickPlayer (client, "Uso de combinação proibida de teclas")
end
addEvent ("keyComboKick", true)
addEventHandler ("keyComboKick", getRootElement(), comboKick)

 

É só substituir o "say" pelo comando utilizado pelo seu chat admin. Por exemplo se você usa "/admchat Texto" para mandar "Texto" para os admins, então só vc trocar o "say" pelo "admchat".

Quando vc usa a tecla T e manda uma mensagem, você está na verdade usando o comando /say.

 

No lugar do kick tem como adicionar por exemplo: Cancelar a animação do jogador, pois essa combinação de tecla causa um bug, e o jogador sai andando rapidamente com a arma na mao e pode atirar '' deslizando '' é um bug do GTA, o kick não é muito viavel pois acabei de perceber que kika jogadores que as vezes estão trocando tiro e apertam w por exemplo em quanto seguram ESPAÇO + MOUSE2 e são kikado, então por exemplo: um congelamento instantaneo de 1 segundo teria como ?

Link to comment
  • Other Languages Moderators
1 hour ago, OverKILL said:

Tem como eu adicionar por exemplo 1 ou mais comandos nesta mesma função? para bloquear? por exemplo: say, Chat

Tem. Liste cada comando em uma table e depois verifique se a tecla apertada tem uma bind com algum desses comandos. Se tiver, bloqueia a tecla.

-- Lista de comandos que serão BLOQUEADOS se forem bindados. Eles ainda podem ser usados manualmente.
disallowedCmds = {
	"say",
	"teamsay",
	"me"
}

addEventHandler ("onClientKey", root, function (button, state) -- Executa essa função quando o jogador pressionar ou soltar uma tecla.
	if not state then return end -- Não verifica ao soltar a tecla, somente ao pressioná-la.
	-- if not getElementData (localPlayer, "bindPermission") then -- Se o jogador não tem permissão de usar binds de texto, então:
		local keys = {} -- tabela local vazia, será preenchida com todas as teclas que possuem qualquer um dos comandos listados em disallowedCmds.
		for i, cmd in ipairs (disallowedCmds) do -- Para cada comando da lista, faça:
			for ii, key in pairs (getBoundKeys (cmd)) do -- Para cada tecla com este comando da lista, faça:
				table.insert (keys, ii) -- Insere na lista keys, cada tecla bindada a cada comando da lista disallowedCmds.
			end
		end
		if keys then -- Se existe alguma tecla com bind de um dos comandos da lista, então:
			for _, keyName in pairs (keys) do -- Para cada tecla com bind de um dos comandos da lista, faça:
				if button == tostring (keyName) then -- Se a tecla usada está com bind de um dos comandos da lista, então:
					outputChatBox ("Tecla bloqueada: "..keyName, 255, 0, 0) -- Avisa o jogador que essa tecla foi bloqueada.
					cancelEvent () -- Cancela o efeito dessa tecla como se ela nem tivesse sido usada.
					break -- Sai do loop do FOR para não precisar verificar as demais teclas com bind dos comandos listados.
				end
			end
		end
	-- end -- Desativei a verificação de ACL no seu caso.
end)

 

  • Like 1
Link to comment
5 minutes ago, Lord Henry said:

Tem. Liste cada comando em uma table e depois verifique se a tecla apertada tem uma bind com algum desses comandos. Se tiver, bloqueia a tecla.


-- Lista de comandos que serão BLOQUEADOS se forem bindados. Eles ainda podem ser usados manualmente.
disallowedCmds = {
	"say",
	"teamsay",
	"me"
}

addEventHandler ("onClientKey", root, function (button, state) -- Executa essa função quando o jogador pressionar ou soltar uma tecla.
	if not state then return end -- Não verifica ao soltar a tecla, somente ao pressioná-la.
	-- if not getElementData (localPlayer, "bindPermission") then -- Se o jogador não tem permissão de usar binds de texto, então:
		local keys = {} -- tabela local vazia, será preenchida com todas as teclas que possuem qualquer um dos comandos listados em disallowedCmds.
		for i, cmd in ipairs (disallowedCmds) do -- Para cada comando da lista, faça:
			for ii, key in pairs (getBoundKeys (cmd)) do -- Para cada tecla com este comando da lista, faça:
				table.insert (keys, ii) -- Insere na lista keys, cada tecla bindada a cada comando da lista disallowedCmds.
			end
		end
		if keys then -- Se existe alguma tecla com bind de um dos comandos da lista, então:
			for _, keyName in pairs (keys) do -- Para cada tecla com bind de um dos comandos da lista, faça:
				if button == tostring (keyName) then -- Se a tecla usada está com bind de um dos comandos da lista, então:
					outputChatBox ("Tecla bloqueada: "..keyName, 255, 0, 0) -- Avisa o jogador que essa tecla foi bloqueada.
					cancelEvent () -- Cancela o efeito dessa tecla como se ela nem tivesse sido usada.
					break -- Sai do loop do FOR para não precisar verificar as demais teclas com bind dos comandos listados.
				end
			end
		end
	-- end -- Desativei a verificação de ACL no seu caso.
end)

 

E sobre a minha resposta acima?

Link to comment
  • Other Languages Moderators

Ta ae, de nada:

function keyCombination (button, state)
	if button == "w" then
		if state then
			setElementData (localPlayer, "button.w", true)
		else
			setElementData (localPlayer, "button.w", false)
		end
	elseif button == "space" then
		if state then
			setElementData (localPlayer, "button.space", true)
		else
			setElementData (localPlayer, "button.space", false)
		end
	elseif button == "mouse2" then
		if state then
			setElementData (localPlayer, "button.mouse2", true)
		else
			setElementData (localPlayer, "button.mouse2", false)
		end
	end
	-- Se o jogador está apertando as teclas acima ao mesmo tempo, então:
	if getElementData (localPlayer, "button.w") and getElementData (localPlayer, "button.space") and getElementData (localPlayer, "button.mouse2") then
		setElementFrozen (localPlayer, true) -- Congela ele no lugar.
		if isTimer (bugTimer) then -- Se já existe um timer para descongelá-lo (jogador tenta bugar enquanto já está congelado), então:
			resetTimer (bugTimer) -- Reinicia o timer para descongelá-lo.
		else -- Se não tem um timer para descongelá-lo, então:
			bugTimer = setTimer (setElementFrozen, 500, 1, localPlayer, false) -- Cria o timer. Depois de meio segundo, descongela o jogador.
			-- O timer reiniciará sempre que o jogador tentar bugar enquanto já está congelado. Dessa forma ele não será descongelado enquanto não parar de bugar.
		end
	end
end
addEventHandler ("onClientKey", getRootElement(), keyCombination)

 

Edited by Lord Henry
Otimização de código
Link to comment
18 minutes ago, Lord Henry said:

Ignorei ela.

Eu tentei desta forma mantendo a verificação:

disallowedCmds = {
	"say",
	"teamsay",
	"me"
}
addEventHandler ("onClientKey", getRootElement(), function (button, state) -- Executa essa função quando o jogador pressionar ou soltar qualquer tecla.
	if not state then return end -- Não verifica ao soltar a tecla, somente ao pressionar.
	if not getElementData (localPlayer, "bindPermission") then -- Se o jogador não tem permissão para usar binds de texto, então:
		local keys = {} -- Obtém uma lista com todas as teclas com binds de texto.
		for i, cmd in ipairs (disallowedCmds) do -- Para cada comando da lista, faça:
			for ii, key in pairs (getBoundKeys (cmd)) do -- Para cada tecla com este comando da lista, faça:
				table.insert (keys, ii) -- Insere na lista keys, cada tecla bindada a cada comando da lista disallowedCmds.
			end
		end
		if keys then -- Se existe alguma tecla com bind de texto, então:
			for keyName, keyState in pairs (keys) do -- Para cada tecla com bind de texto, faça:
				if button == keyName then -- Se a tecla pressionada está com bind de texto, então:
					outputChatBox ("Tecla bloqueada, contém bind de texto tecla: "..keyName, 255, 0, 0) -- Avisa o jogador que essa tecla foi bloqueada.
					cancelEvent () -- Cancela o efeito dessa tecla como se ela nem tivesse sido usada.
					break -- Sai do loop do FOR para não precisar verificar as demais teclas com bind de texto.
				end
			end
		end
	end
end)

Porém deu alguns erros relacionados ao pairs

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