Como a execução de som pode servir para fechar game?

Gosto de um jogo que ele tem uma tarefa repetitiva e, por motivos óbvios, posso deixar ele rodando nos bastidores enquanto não estou no computador.

Quando a tarefa termina, ela executa um som específico (um arquivo de áudio em disco).

A minha intenção é escrever um código em Java que monitore o jogo (ou a pasta em disco com os arquivos de áudio), e quando um determinado áudio for executado, o código vai fechar o jogo e desligar o computador.

Eu entendo que a parte de localizar o programa em execução não deve ser difícil, muito menos desligar o computador.

Sendo assim, peço ajuda de vocês: como vocês recomendariam fazer, em java, a parte de monitorar a execução de um áudio específico?

Desde já meu muito obrigado pelas ideias.

Fiz algo parecido a muito anos, eu mudei via cheat engine a referencia que o jogo fazia ao arquivo. Por exemplo se no código fonte do jogo apontava para o arquivo som.mp3 eu via cheat engine (tem vários tutoriais na net) mudei para que executasse meu arquivo Teste.bat e nesse arquivo coloquei para desligar o pc. Usava isto para farmar em joguinhos kkk. Não vou saber te explicar o passo a passo, pois foi algo muito espeficio do jogo, mas a base é essa e tem vários tutos de cheat engine.

É claro, isso tudo não passa de uma enorme gambiarra kkkkk, mas resolveu meu problema na época.

Se você quiser existe a api do windowns Windows API e conseguentemente várias outras APIs em java que fazem essa integraçao da Windows API (anteriormente Win32 API) com o java.
Outra opção é o JNI (Java Native Interface), mas confesso que só ouvi falar, nunca nem vi.

Adoraria te ajudar mais, porém realmente não tenho conhecimento especifico nisso, mas a base de como pode funcionar e as ferramentas estão ai.

2 curtidas

É uma ideia interessante, de verdade, mas queria uma ideia de como o Java pode monitorar uma pasta ou monitorar a memória.

´Bom, ai já não sei se tem como. Vejo até um possível problema nisso, vai que o jogo ao invés de executar o arquivo de som toda vez que x coisa acontecer no jogo, ele executar quando for fazer o loading inicial do jogo acessa esse arquivo e deixa guardado na memória dele. Sendo assim mesmo você monitorando a pasta/arquivo você só iria captar a execução quando ele for carregado para dentro da memória temporária do jogo e sendo assim pode não atender seu critério que é detectar x função no jogo.

O cheat engine ele trabalha alterando valores diretamente na memória processada pelo programa/jogo em tempo real de execução, então você tem como alterar variáveis do programa por meio dele, você descobrindo a indefiticação hexadecimal da variável, vc consegue substituir com outro valor e fazer oq falei.

1 curtida

Supondo que esse som esteja rodando dentro do Java, usaria o evento do Media Sound.

1 curtida

Na realidade não tenho acesso ao código-fonte do jogo, apenas quero detectar (escrevendo um software em Java, que é o que estou aprendendo) quando um som for executado.

Encontrei a biblioteca javax.sound.sampled para coletar sons no computador. Pode ser que talvez seja uma alternativa: monitorar a saída de áudio e, quando capturar algum que seja comparável, tomar as ações necessárias. Talvez.

Se alguém tiver alguma sugestão melhor que essa ideia que eu tive, por gentileza gostaria de saber. Muito obrigado.

Pra dizer a verdade Eu não entendi direito o que voce realmente deseja fazer.

1-Criar um Jogo e fechar atraves do som externo?
2-Fazer engenharia reversa de um jogo externo?

Mas por que tem que fechar o jogo atraves do tipo de Som?

O jogo é de outra pessoa e ele não tem acesso. Imaginemos que é o CSGO.

Ele quer basicamente criar um “Cheat”, que ao tocar um determinado som (um barulho de tiro, por exemplo) o sistema dele (em java) possa detectar e executar X ação.

Basicamente isso

1 curtida

1…
Tudo isso terá que ser bem responsivo e rapido.
No linux uso o pavucontrol que intercepta todo o som que vai para a caixa.
No caso de usar isso com Java precisa de acesso nativo, mas nunca testei isso no
https://docs.oracle.com/javase/tutorial/sound/capturing.html
(Quando Eu tiver um tempo vou dar uma olhada nisso, mais por curiosidade mesmo)
Resolvendo essa etapa restará somente comparar o conteudo.

1 curtida

Não quero fazer engenharia reversa no jogo. :wink:

Pense em jogos tipo RPG com tarefas repetitivas, do tipo construir um item para ganhar XP. Você pode deixar o personagem craftando as coisas por um período de tempo, mas não infinitamente porque vai precisar comprar mais material para isso.

Então, pela quantidade de material que tenho no estoque, sei que o personagem vai conseguir manufaturar X ou Y peças. A cada vez que o personagem termina a ação de manufatura (craft), o jogo emite um som.

Devido a fatores internos que estão além da minha capacidade de prevê-los, não posso afirmar quanto tempo a ação irá levar; mas sei que executará um determinado som X vezes.

Essas tarefas não influenciam o andamento do jogo, servem apenas para contagem. Por isso eu poderia deixar o computador ligado e ir dormir, enquanto ele trabalha nisso. E quando o som fosse executado, significaria que chegou ao ponto de encerrar.

Se ele encerra e não tem mais tarefas, não preciso deixar o computador ligado, gastando energia. Por isso, então, o computador seria desligado. :wink:

Sem engenharia reversa, sem abrir código de outra pessoa.

Eu não chamaria de cheat, mas a ideia é simples assim, como você colocou: ao receber um barulho indicativo de tarefa, ele vai executar a ação de encerrar e desligar.
:slight_smile:

Obrigado! Vou dar uma olhada.

Pelo que eu estava vendo, eu poderia talvez tentar capturar um áudio com AudioInputStream a cada X segundos, cortar silêncios ou sons em baixo volume com Clip e depois comparar com outro AudioInputStream (do arquivo em lide).

Não é uma solução elegante, ou simples como analisar a memória, mas me parece uma alternativa que talvez possa funcionar.

Inclusive esse tipo de código pode até ser útil em tarefas de escritório, para coisas que precisam de atenção imediata.

(só não vale recriar aquele alerta do MSN que tremia a tela)

Vou ser o chato da vez. Lidar com processamento de sinais não é algo trivial… Se eu fosse vc, usava a abordagem do @rodriguesabner, usando alguma ferramenta que já existe para fazer esse tipo de coisa. Fazer isso manualmente, ainda mais em Java, é praticamente suicídio. Não é impossível, mas é bem complicado pra quem não entende do assunto (processamento de sinais).

1 curtida

Isso me soa como um desafio interessante, algo para eu estudar e buscar. Vai dar muito trabalho, eu creio, mas creio também que vou aprender muito no processo!

Obrigado a todos pelas respostas e ideias, @davidbuzatto @j-menezes @rodriguesabner e @GabrielA2

1 curtida

É isso ai.

1 curtida