@Lord Henry Não é necessário descompilar pra conseguir executar o código, e o MaligNos já explicou o porquê. Faça um teste você mesmo.
Aqui um exemplo:
function enterVehicle ( player, seat, jacked )
cancelEvent( true )
outputChatBox ( "Veiculos bloqueados!", player )
end
addEventHandler ( "onVehicleStartEnter", getRootElement(), enterVehicle )
Ok, esse código vai impossibilitar o jogador de entrar em qualquer veículo.
Agora, eu crio outro script separado, exatamente assim:
_cancelEvent = cancelEvent
function cancelEvent()
return _cancelEvent(false)
end
Resultado, a função cancelEvent lá dentro do outro código será sempre chamada dessa forma: cancelEvent(false) mesmo que outro valor seja passado.
Agora, impedindo essa "interferência externa":
local _cancelEvent = cancelEvent
local function cancelEvent( ... )
return _cancelEvent( ... )
end
function enterVehicle ( player, seat, jacked )
cancelEvent( true )
outputChatBox ( "Veiculos bloqueados!", player )
end
addEventHandler ( "onVehicleStartEnter", getRootElement(), enterVehicle )
Aquele wrapper (assim que também é conhecido) no outro script não vai mais mudar nada nesse que o cancelEvent está local.
Edit Esse código acima na verdade não vai impedir nada pois a esse ponto já irá receber a função reescrita.
--
Até mesmo a variável que armazena a chave de proteção está vulnerável - isso porque existe a biblioteca Lua debug (além de _G), já mencionados. E essas funções estão habilitadas no MTA.
Meio fora do assunto, mas há alguns anos atrás, um membro do fórum tinha conseguido obter a chave de encriptação utilizada internamente no MTA (procurei esse post, mas perece que já foi removido).