sábado, 28 de março de 2026

POR QUE SEU __DIR__ FALHOU OU O "INFERNO" DOS CAMINHOS NO PHP

POR QUE SEU __DIR__ FALHOU?

O que ganharei lendo este artigo?

Domínio de Escopo: Aprenderás que diretórios (pastas) e subdiretórios mudam a percepção do PHP.
Segurança com Constantes: Aprenderás a "travar" o caminho real do projeto para não depender tanto de onde o script está rodando.

Warning: fopen(leitura.txt): Failed to open stream: No such file or directory in/caminho/da/mente/do/ledor/inteligencia.php on line 0
Caro ledor, caso não quiser ler, na Conclusão tem um resumo (receitinha de bolo)!

No desenvolvimento web, existem três "raízes" diferentes acontecendo ao mesmo tempo no teu projeto|site|aplicativo, etc:

1- A Raiz do servidor web (DocumentRoot):
Depende de como você instala, geralmente, no Apache, é o /var/www/html no Linux e C:\Apache24\htdocs no Windows.
No Nginx geralmente é C:\nginx\html e /var/www/html ou /usr/share/nginx/html.
São o popular e famoso "localhost".
O Apache, Nginx, etc, olha para lá para saber onde o projeto|site|aplicativo começa.

2- A Raiz do Navegador (URL):
Quando você coloca barra (/) no HTML (ex.: <img src="/foto.jpg">), o navegador busca na raiz do domínio(localhost/foto.jpg), ignorando as pastas do site.

3- A "Raiz" do Script PHP (__DIR__):
É onde está o arquivo físico no SD|HD naquele momento, ou seja, para o PHP, a raiz é o diretório onde está o arquivo|script e é a partir deste diretório que o PHP vai procurar os arquivos chamados.

Parece complicado, mas confunde-se pela simplicidade.

Em vez de se fazer sempre essa pergunta programando em PHP: "onde estou para chamar os arquivos que quero?", veremos a maneira correta, bem mais simples.

Se estou no arquivo.php no caminho /pasta1/pasta2/arquivo.php então a raiz (__DIR__) para o PHP é a pasta2.

Se mudar o arquivo.php para a pasta1, então a raiz agora para o PHP é a pasta1.
É aquele negócio de ir e voltar diretórios|pastas (../../).

A bússola que te dava o norte era: onde estou? ...quem sou eu... de onde viemos, para onde vamos? Essa última parte foram apenas divagações minhas!
Tinha de se raciocinar a partir da pasta|diretório no qual está o arquivo onde se chamaria outros arquivos.

Então, o problema não é a constante __DIR__ em si, mas onde ela é definida.
Se tu cria e define, por exemplo, a constante RAIZ_SIS dentro do diretório /pasta3/, ela "nasce" com o DNA dessa pasta, ou seja, para o PHP essa é a "pasta raiz" a partir de onde ele vai procurar os arquivos.
Se tu usar essa mesma lógica em outro arquivo que não esteja dentro dessa mesma pasta, a constante terá outro valor.
Isso é o que causava e causa a confusão.

Por exemplo:
if (!defined('RAIZ_SIS')) {
define('RAIZ_SIS', __DIR__ . DIRECTORY_SEPARATOR);
}
sendo que RAIZ_SIS é o caminho real /opt/apache24/htdocs/pasta1/pasta2/, pois pasta2 é a "raiz" do projeto, do site, do aplicativo, etc.

Poderia ser /opt/apache24/htdocs/pasta1/ e daí pasta1 seria a "raiz", o diretório principal (__DIR__) do teu projeto, do teu site, do teu aplicativo, etc, és tu quem decides, pois o projeto é teu, bem como a culpa se tu errar, ela é tua, porém, justamente por ser tua, depois tu atribui esse parâmetro (a culpa) para quem tu quiser, mas vamos usar a estrutura pasta1/pasta2 para exemplificar.

EXEMPLOS

Lembrando que, em vez de /opt/apache24/htdocs/pasta1/pasta2/ pode ser /var/www/html/pasta1/pasta2 ou C:\Apache24\htdocs\pasta1\pasta2\ ou onde tu quiser de acordo com o que o sistema operacional permitir.

Lembrando também que:

DIRECTORY_SEPARATOR Janelas = \
DIRECTORY_SEPARATOR Linux|MacOS = /

Crio um diretório chamado "api" dentro de pasta2 que é a "raiz" (o diretório principal) do projeto.
O caminho para "api" é /opt/apache24/htdocs/pasta1/pasta2/api.

A partir de agora colocarei somente /pasta1/pasta2/, mas entenda que o localhost está antes.

Lembrando que /opt/apache24/htdocs e C:\Apache24\htdocs e /var/www/html são, por padrão, o famoso localhost no Linux e no Janelas, aquele que, quando tu digita localhost na barra de endereços, o Apache grita It works! porque encontrou o arquivo index.html (C:\Apache24\htdocs\index.html) e dentro dele tem escrito It works e se fica todo feliz porque conseguiu fazer o Apache funcionar.

No Linux, o localhost na instalação padrão é /var/www/html (a não ser que tu mude, mas ai é problema teu, não meu).

Você, caro leitor, se for uma pessoa inteligente, deve ter percebido a diferença do Linux para o Janelas do "detalhe" das barras separadoras que formam o caminho para os diretórios e arquivos.
Já veremos esse "detalhe" também.

Antes, caro leitor, veremos uma coisa chamada Estratégia do "Ponto de Entrada Único", do conceito de estratégia, em grego strateegia, em latim strategi, em francês stratégie... os senhores estão anotando?

Nessa estratégia profissional utilizamos um arquivo central chamado config.php ou autoload.php oude_o_nome_que_quiser.php na raiz real do projeto, ou seja, no nosso caso:/pasta1/pasta2/de_o_nome_que_quiser.php.

Neste arquivo definimos as constantes com seus caminhos que utilizaremos no projeto|site|aplicação, etc.

Define-se, por exemplo, a constante RAIZ_SIS (ou DE_O_NOME_QUE_QUISER, agora na versão maiúscula) uma única vez nesse arquivo de configuração.

Segue um exemplo:

<?php
// Este arquivo autoload.php fica na RAIZ do projeto|site|aplicativo...
// __DIR__ aqui SEMPRE serah a raiz.
// dirname(__DIR__) recua um nivel na estrutura de pastas (Funcao Nativa).
// Exemplo: dirname(__DIR__) . DIRECTORY_SEPARATOR . "autoload.php";
// __DIR__ . DIRECTORY_SEPARATOR; = C:\Apache24\htdocs\pasta1\pasta2\
// Janelas - RAIZ_SIS (ou PATH_ROOT) = C:\Apache24\htdocs\pasta1\pasta2\
// Linux - RAIZ_SIS (ou PATH_ROOT) = /opt/apache24/htdocs/pasta1/pasta2/
// Define a URL base do site:
// define('URL_BASE', 'http://localhost/pasta1/pasta2');
// PATH_ROOT: Caminho absoluto no disco (para utilizar com file_put_contents, require, include, etc).
// URL_BASE: Caminho do navegador (para utilizar com href, src de imagens, etc).
// DIRECTORY_SEPARATOR Janelas = \
// DIRECTORY_SEPARATOR Linux|MacOS = /
if (!defined('RAIZ_SIS')) {
    define('RAIZ_SIS', __DIR__ . DIRECTORY_SEPARATOR);
}
if (!defined('PASTA_API')) {
    define('PASTA_API', RAIZ_SIS . 'api' . DIRECTORY_SEPARATOR);
}

Aproveitamos e já definimos, também, uma constante para o diretório api chamada PASTA_API, cujo caminho é /opt/apache24/htdocs/pasta1/pasta2/api/.

Repare, vivente, que no final da tripa tem uma barra (/ ou \), essa é a constante predefinida DIRECTORY_SEPARATOR agindo.
O PHP identifica o sistema operacional e essa constante, se for chamada, finca no final da tripa a barra de acordo com o sistema operacional.

E assim tu vai, alegremente, definindo e/ou utilizando as constantes necessárias.

Lembrando que __DIR__ é uma das constantes mágicas do PHP.

Da página do PHP:

__DIR__ - "O diretório do arquivo. Se usada dentro de um include, o diretório do arquivo incluído será retornado.
Isso é equivalente a dirname(__FILE__).
O nome do diretório não possui barra no final, a menos que seja o diretório raiz."
Explica nada e diz coisa nenhuma.

Exemplo Real

Nesse exemplo real tenho essas chamadas aos arquivos:

require_once __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php';
require_once PASTA_API . 'proc_criar.php';

E dentro do arquivo proc_criar.php tenho estas definições:

$arquivoCursos = RAIZ_SIS . 'cursos.txt';
$arquivoBkpExtra = $pastaExtra . DIRECTORY_SEPARATOR . 'cursos_bkp_extra.txt';
Criei um arquivo "teste.php", coloquei dentro o conteúdo abaixo para solucionar essa bagunça:

require_once  __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";
$arquivoCursos = RAIZ_SIS . 'cursos.txt';
$pastaExtra = RAIZ_SIS . 'copiados';
$arquivoBkpExtra = $pastaExtra . DIRECTORY_SEPARATOR . 'cursos_bkp_extra.txt';
die("Caminho Real: " . realpath($arquivoBkpExtra));

Executei o arquivo e na saída auto-explicativa apareceu:

Caminho Real: C:\Apache24\htdocs\pasta1\pasta2\copiados\cursos_bkp_extra.txt
e
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/copiados/cursos_bkp_extra.txt

E executei também:

require_once  __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";
$arquivoCursos = RAIZ_SIS . 'cursos.txt';
die("Caminho Real: " . realpath($arquivoCursos));
$pastaExtra = RAIZ_SIS . 'copiados';
$arquivoBkpExtra = $pastaExtra . DIRECTORY_SEPARATOR . 'cursos_bkp_extra.txt';

Saída:
Caminho Real: C:\Apache24\htdocs\pasta1\pasta2\cursos.txt
e
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/cursos.txt

Se tu mudar o nome da pasta "pasta2" para "projeto_final", não precisa mexer em nada porque o __DIR__ no arquivo central se atualiza sozinho.

RAIZ_SIS será exatamente a mesma string em qualquer lugar do sistema.
Se tu escrever "require_once RAIZ_SIS . 'cursos.txt'", o PHP sempre buscará o arquivo na pasta principal, esteja você no diretório /api/, /admin/ ou no index.php ou na casa do ... .

Se o arquivo ficasse dentro da pasta api, você usaria a constante que definiu no arquivo central: include_once PASTA_API . 'arquivo'.

Obs.: Ao usar a função realpath, o script em execução deve ter permissões de executável em todos os diretórios na hierarquia, caso contrário realpath() retornará false.

Liberdade total.
O PHP é o Linux das linguagens de programação!

CAMINHOS ABSOLUTOS E CAMINHOS RELATIVOS

Evitando o Inferno e Indo para o Céu

Não tem necessidade de usar explicitamente caminhos absolutos e/ou relativos em PHP.
No HTML, se você está em api/proc_criar.php e quer voltar para a raiz, você usa ../.
No PHP, se você usa __DIR__, ele te entrega o caminho completo do Windows/Linux/MacOS até aquela pasta específica.

Imagine que você tem o arquivo "processa.php" dentro da pasta api.

No Servidor (Linux): __DIR__ é /var/www/html/projeto/api
No seu PC (Windows): __DIR__ é C:\Apache24\htdocs\projeto\api

Temos esses arquivos nesses caminhos:
/var/www/html/projeto/api/processa.php;
/var/www/html/projeto/api/fincao.php;
/var/www/html/projeto/autoload.php;
ou
C:\Apache24\htdocs\projeto\api\processa.php
C:\Apache24\htdocs\projeto\api\fincao.php
C:\Apache24\htdocs\projeto\autoload.php

Quando você escreve no topo do arquivo processa.php:
require_once dirname(__DIR__) . DIRECTORY_SEPARATOR . "autoload.php";
require_once "fincao.php";
o PHP resolve isso "em tempo de execução".

A função nativa dirname retorna o caminho para o diretório pai, sendo que o diretório pai é um diretório acima.
O PHP não tem uma função nativa, por exemplo, childname, que avançasse para um diretório abaixo e nem precisa ter.

Ele (e você) não precisam mais ficar calculando onde estão e para onde ir.
O caminho do arquivo e as instruções estão ali, explícitos: mais explícitos do que um site pornográfico!
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.
Tu só teria de atualizar as chamadas se resolvesse mudar a estrutura de pastas do teu projeto, por exemplo, tirar um arquivo de dentro da pasta api e colocar ele na raiz.

Se a estrutura interna (diretórios e arquivos) for mantida, o código é 100% portátil.

Se um dia tu resolver atirar teu site do Janelas para Linux ou vice-versa, precisa fazer absolutamente nada, pois:

DIRECTORY_SEPARATOR Janelas = \
DIRECTORY_SEPARATOR Linux|MacOS = /

O próprio PHP se encarrega do trabalho.

Não coloque barras junto ao nome do arquivo chamado no require|include, coloque a constante predefinida DIRECTORY_SEPARATOR separada por um espaço e um ponto de cada lado, além de ser o jeito certo, a sintaxe fica linda de morrer! Fica um must!!!

Contudo, porém, todavia, entretanto, sempre dá para melhorar!

Imagine que teu projeto|site|aplicação cresceu e agora tu tem:

projeto/modulos/financeiro/scripts/processar.php

Em vez de escrever:

$arquivo = "../../../../cursos.txt"; (onde é fácil errar a quantidade de pontos e barras)

tu apenas faz:

$arquivo = RAIZ_SIS . 'cursos.txt';
É mais fino, elegante e sincero!

Pare de usar essa coisa pré-histórica de código morse: ../../.

Utilize constantes definidas por você junto com DIRECTORY_SEPARATOR (constante predefinida) E SEUSPROBLEMAS ACABARAM!!!

Repare vivente:

require_once __DIR__ . '/../arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php

Fica:
require_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR . 'arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php

O caminho do arquivo e as instruções estão ali, mais explícitos do que um site pornográfico!
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seu projeto continue a mesma.
Lembrando que RAIZ_SIS = /opt/apache24/htdocs/pasta1/pasta2.

Caso um determinado diretório seja bastante utilizado, crie uma constante para ele dentro do autoload.php(ou config.php ou de_o_nome_que_quiser.php).

Com a constante DIR_PASTA3, o "include_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR .'arquivo.php';" transforma-se em:

include_once DIR_PASTA3 . 'arquivo.php';
É muito mais fino, mais elegante e mais sincero ainda!
Nem vou falar da facilidade, porque é óbvio.

O caminho real é, por exemplo,
/opt/apache24/htdocs/projeto/modulos/api/arquivo.php, pois DIR_PASTA3 é /var/www/html/projeto/modulos/api/, já com a barra (/) no final, pois ela foi definida junto com a constante no arquivo central.

Sem o arquivo central autoload|config|de_o_nome_que_quiser.php, em cada diretório do teu sistema (no/api, no /admin, no /relatorios, etc), você tem de calcular manual e mentalmente onde está cada arquivo a ser chamado.
Se você mudar o arquivo de lugar, tem que editar todos os arquivos referenciados.
Com o arquivo central só precisa acertar o arquivo central, por isso se chama arquivo central, porque centraliza centralizando a centralização.

Uma vez que o arquivo central de constantes foi carregado, todas as variáveis de caminho ($arquivoCursos, $arquivoBackup, $arquivoseilaoque, etc) funcionam magicamente com o mesmo nome em qualquer lugar, sem precisar calcular manual e mentalmente.

Com isso evita o inferno e vai para o céu.

Liberdade total.
O PHP é o Linux das linguagens de programação!

CONCLUSÃO

Utilize a constante mágica __DIR__ do PHP para chamar arquivos.
Utilize a propriedade do PHP de criar constantes.
Utilize as constantes predefiniddas do PHP.
Utilize, em especial, as constantes predefinidas DIRECTORY_SEPARATOR e dirname.

DIRECTORY_SEPARATOR Windows = \
DIRECTORY_SEPARATORLinux|MacOS = /

Em vez de escrever:
$arquivo = "../../../../cursos.txt"; (onde é fácil errar a quantidade de pontos e barras).

Faça:
$arquivo = dirname(RAIZ_SIS, 3) . DIRECTORY_SEPARATOR . 'cursos.txt';

A função dirname aceita o formato acima onde RAIZ_SIS é a constante criada por você e 3 é o número de diretórios para retornar e buscar o arquivo desejado.

Utilize constantes definidas por você junto com DIRECTORY_SEPARATOR e dirname.

Exemplo:
require_once __DIR__ . '/../arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php

Defina a constante no arquivo central:
if (!defined('RAIZ_SIS')) {
    define('RAIZ_SIS', __DIR__ . DIRECTORY_SEPARATOR); }

Faça:
require_once RAIZ_SIS . 'pasta3'. DIRECTORY_SEPARATOR . 'arquivo.php';
Caminho Real: /opt/apache24/htdocs/pasta1/pasta2/pasta3/arquivo.php

ou melhor ainda:
arquivo = dirname(RAIZ_SIS, 1) . DIRECTORY_SEPARATOR . 'cursos.txt';
A função dirname aceita o formato acima onde RAIZ_SIS é a constante criada por você e 1 é o número de diretórios para retornar e buscar o arquivo desejado.

O caminho do arquivo e as instruções estão ali explicitamente.
Isso funciona em qualquer sistema operacional e em qualquer pasta, desde que a estrutura de pastas do seuprojeto continue a mesma.
Com o arquivo central com as constantes predefinidas e criadas/definidas por você (autoload.php,config.php, de_o_nome_que_quiser.php) só precisa acertar o arquivo central sem mexer em mais nada.

Uma vez que o arquivo central de constantes foi carregado, todas as variáveis de caminho ($arquivoCursos,$arquivoBackup, $arquivoseilaoque, etc) funcionam magicamente com o mesmo nome em qualquer lugar, sem precisar calcular manual e mentalmente.

Você só precisa ter o cuidado ao chamar o arquivo central de acordo com o arquivo que o chama.

Em um arquivo que está no mesmo diretório (diretório principal) do arquivo autoload.php:

require_once __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";

Em um arquivo que está um diretório abaixo do diretório "raiz" onde está o arquivo autoload.php (dirnameretorna um nível):
require_once __DIR__ . DIRECTORY_SEPARATOR . "autoload.php";

Receita de Bolo

Levando-se em conta que o arquivo "carretel.php" esteja em um diretório abaixo do diretório "raiz" do site|projeto|aplicação, etc, o diretório principal, no caso, é a pasta2, ou seja, o arquivo está no caminho real:

/var/www/html/pasta1/pasta2/pasta3/carretel.php.

Para chamar outros arquivos no topo do arquivo "carretel.php":
require_once __DIR__ . DIRECTORY_SEPARATOR . "bagoal.php"; <<< aqui tu caça um bagoal no mesmo diretório;
require_ONCE DIRNAME(__dir__) . DIRECTORY_SEPARATOR . 'fincao.php' <<< aqui tu encontra um fincao um diretório acima;
require_once RAIZ_SIS . 'api' . DIRECTORY_SEPARATOR . 'proc_criar.php'; <<< aqui tu deseja proc_criar um diretório abaixo;
$arquivoCursos = RAIZ_SIS . 'texticulo.txt'; <<< aqui tu pega o texticulo no mesmo nível e introduz o barbante numa variável.

Mais realmente e seriamente:
require_once __DIR__ . DIRECTORY_SEPARATOR . 'autoload.php'; <<< aqui busca autoload.php no mesmo diretório;
require_ONCE DIRNAME(__dir__) . DIRECTORY_SEPARATOR . 'funcao.php' <<< aqui busca funcao.php um diretório acima;
require_once RAIZ_SIS . 'api' . DIRECTORY_SEPARATOR . 'processa.php'; <<< aqui busca processa.php um diretório abaixo;
$arquivoCursos = RAIZ_SIS . 'cursos.txt'; <<< aqui busca cursos.txt no mesmo diretório e salva a string numa variável.

Liberdade total.
O PHP é o Linux das linguagens de programação!




quarta-feira, 18 de março de 2026

Instalar OnlyOffice no Linux

O ONLYOFFICE é um pacote de aplicativos de escritório de código aberto que permite visualizar, editar e colaborar em documentos, planilhas, apresentações, PDFs e muito mais. Disponível para web, desktop e dispositivos móveis , ele garante que você se mantenha produtivo em qualquer lugar!É o mais compatível com o Office da Microsoft.
Suporte para formatos populares: Compatível com DOCX, XLSX, PPTX, PDF, ODT, ODS, ODP, TXT, RTF, HTML, EPUB, CSV, etc.
Multiplataforma: Use na web, em computadores (Windows, macOS, Linux) ou em dispositivos móveis (iOS, Android).

Acesse o link:

Escolha DesktopEditors-x86_64.AppImage e faça o baixamento.

Ou pelo wget:
$ cd
$ cd Downloads
$ wget https://github.com/ONLYOFFICE/appimage-desktopeditors/releases/download/v9.3.1/DesktopEditors-x86_64.AppImage

Aconselho a colocar o arquivo DesktopEditors-x86_64.AppImage em uma pasta que você tenha certeza de que não será mofificada.


Por exemplo, estando dentro do diretório Downloads:
$ mkdir -p /home/$USER/Apps
$ cp DesktopEditors-x86_64.AppImage /home/$USER/Apps/

Permissivando:
$ chmod +x /home/$USER/Apps/DesktopEditors-x86_64.AppImage

Abrindo pelo terminal:
$ /home/kluster/Apps/DesktopEditors-x86_64.AppImage

Senão crie um lançador (atalho) na área de trabalho.
Seja pelo terminal ou pelo mouse que você criar um atalho, no "Comando" ou "exec" coloque o caminho "/home/seu_usuario/Apps/DesktopEditors-x86_64.AppImage", sem as aspas.
Nesse caminho tem de ser o nome do usuário, não pode ser a variável $USER.


Caso quiser o ícone do OnlyOffice, procure no Google em "Imagens" e salve em /usr/share/icons.
Talvez tenha que salvar primeiro em Downloads ou outra pasta (Apps) e depois copiar para /usr/share/icons com sudo por causa das permissões.
Ou salve em qualquer lugar e aponte o caminho no atalho.

Exemplo:

[Desktop Entry]
Name=OnlyOffice
Exec=/home/buckminster/Apps/DesktopEditors-x86_64.AppImage
Comment=
Terminal=false
PrefersNonDefaultGPU=false
Icon=/usr/share/icons/onlyoffice.png
Type=Application


Site:

sexta-feira, 27 de fevereiro de 2026

INSTALAR (e jogar) COUNTER STRIKE 1.6 (install cs 1.6) NO LINUX


INTRODUÇÃO

O Counter Strike 1.6 dispensa apresentações, então: estão dispensadas.

Todo mundo sabe que jogo é esse... e se não sabe deveria saber!

A instalação aqui foi testada e aprovada no Debian 13, mas nada impede que não possa ser realizada a contento em outras distribuições, bastando adaptar os comandos, pois o código fonte do CS1.6 serve em qualquer Linux.

Na seção ESTUDO DE CASOS tem algumas coisas para fazer em caso de erros, conexão bloqueada, etc.

Na seção SCRIPTS tem alguns scripts úteis.

O procedimento aqui é puramente didático porque para jogar CS online gratuito basta entrar no link:

https://play-cs.com/pt/servers

escolher um servidor com o "map" desejado e conectar.

Contudo, para quem quer ter o CS1.6 instalado e personalizado no Linux e por uma questão de aprendizado, leia todo o artigo antes de sair executando comandos.

Parece muita coisa para fazer porque está bem explicado, mas é tranqüilo e rápido!


VÍDEO

Vídeo onde você pode me ver jogando e falhando miseravelmente nas missões:

https://drive.google.com/file/d/1lZat4icP9PeSDy14y927XDMi3BAhJ3t6/view?usp=sharing

Sem mais delongas...


Fire in the hole!

Need backup!

Sector clear!

The bomb has been planted!

Go go go!


DOWNLOAD

Abra o terminal.

$ sudo apt update

$ sudo apt install xz-utils dos2unix wget

Qbittorrent é opcional, mas instale caso baixe o .tar da Free Linux PCGames:

$ sudo apt install qbittorrent


Quando tiver de usar "sudo" indicará no comando.

Para o download tem duas opções.

1)

https://freelinuxpcgames.com/counter-strike/

Clique no link acima e mais abaixo na página encontre o link:

Half-Life/Blue Shift/Opposing Force/Counter-Strike 1.6 [x86] [Multi] [Native]

Caso, ao clicar no link, abrir uma janela de propaganda, feche-a e clique novamente no link que o download abrirá.




2)

https://drive.google.com/file/d/1qIWFrOLrUl-GRVX05fcXo35gRGqdUydU/view?usp=sharing


Caso aparecer a mensagem:

"O Google Drive não pode fazer a verificação de vírus neste arquivo.

O arquivo HLCS_Linux.tar.xz (757M) é muito grande para a verificação de vírus do Google. Você ainda quer fazer o download?"

Ignore e clique em "Fazer o download mesmo assim".

Disponibilizei no Google Drive porque, algumas vezes, o download do torrent do Free Linux PCGames falha ou demora muito.


Obs.: disponibilizei, também, no Google Drive, a pasta "cstrike" com "models, "maps, etc, para quem não quiser esperar baixar do servidor, são 387,2 MiB. Basta fazer o download e copiar a pasta para /opt/cstrike/HLCS/game, substituindo a pasta de mesmo nome que ali está:

https://drive.google.com/drive/folders/1X4nTQ_Nd5mG9KQg4x_tm2IEjZmHZGOnh?usp=sharing


INSTALANDO


Execute:

$ sudo apt update
$ sudo apt install locales
$ sudo dpkg-reconfigure locales





Terminará:

/opt/cstrike/HLCS$ sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  en_US.UTF-8... done
  pt_BR.UTF-8... done
Generation complete.


Habilitando, instalando dependências e bibliotecas de 32 bits:

$ sudo dpkg --add-architecture i386
$ sudo apt update


$ sudo apt install libc6:i386 libstdc++6:i386 libgcc-s1:i386 lib32gcc-s1 \
libgl1:i386 libglu1-mesa:i386 libx11-6:i386 libxext6:i386 \
libxrandr2:i386 libxcursor1:i386 libxinerama1:i386 \
libasound2:i386 libopenal1:i386 libsdl1.2debian:i386 zlib1g:i386 \
libfontconfig1:i386 libxft2:i386 libgtk2.0-0:i386 libnss3:i386 libnspr4:i386


$ sudo apt install libgpg-error0:i386 libcurl4:i386 libsdl2-2.0-0:i386 libxi6:i386 libvdpau-dev:i386 libgl1-mesa-dri:i386
$ sudo apt install libnss-myhostname:i386 libnm0:i386 libnss3:i386 libnss-mdns:i386 libpulse0:i386


Criando uma pasta para instalação (instalei em /opt):

$ cd /opt
$ sudo mkdir cstrike
$ cd cstrike


Copie o arquivo de onde você o baixou, no caso, da pasta Downloads, adapte se o caminho for diferente:

$ sudo cp ~/Downloads/HLCS_Linux.tar.xz /opt/cstrike/


Verifique:

$ ls

HLCS_Linux.tar.xz


Descompacte:

$ sudo tar -xJf HLCS_Linux.tar.xz
$ ls

HLCS  HLCS_Linux.tar.xz


Garanta que seu usuário é o dono:

$ cd
$ sudo chown -R $USER:$USER /opt/cstrike/HLCS


Agora faremos cópia e executaremos o jogo pela primeira vez para criar automaticamente o diretório /opt/cstrike/HLCS/game/platform/config:

$ cd /opt/cstrike/HLCS
$ ls

bshift.sh  cstrike.sh  game  hl.sh  oforce.sh  steam-runtime


$ cp cstrike.sh cstrike.sh.bkp
$ vim cstrike.sh (uso o vim, use o teu editor de texto)

Apague o conteúdo e coloque dentro:

#!/bin/bash

export SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
export DIR="$(dirname "$SCRIPT")"

cd "$DIR/game"

# Para executar em tela cheia basta tirar -window -w 1024 -h 768
"$DIR/steam-runtime/run.sh" ./hl.sh -game cstrike -window -w 1024 -h 768


Salve e saia.


Somente acrescentamos os parâmetros "-window -w 1024 -h 768" para definir a tela do jogo em 1024/768, depois, caso queira, basta retirar os parâmetros que o jogo abrirá em tela cheia.

Garantindo que seja um arquivo unix/linux/ascii:

$ dos2unix cstrike.sh

dos2unix: convertendo o arquivo cstrike.sh para formato Unix...


Garanta a permissão de execução:

$ chmod +x cstrike.sh


Testando:

$ ./cstrike.sh


Teste clicando em New Game > de dust2 > Start > OK escolha as opções, por exemplo, 1 TERRORIST FORCES > 1 PHOENIX CONNEXION.


Entrarás no jogo, mas ainda não estás conectado em um servidor para jogar.

Neste momento tu podes atirar (botão esquerdo), movimentar-se (setas de direção), apreciar o cenário, etc, mas nada além disso.

Saia pressionando a tecla Esc depois escolha Quit > Quit game.

Verifique se a pasta foi criada automaticamente com os arquivos:

$ ls /opt/cstrike/HLCS/game/platform/config/

InGameDialogConfig.vdf ServerBrowser.vdf


Criando link para a pasta de downloads:

$ ln -s /opt/cstrike/HLCS/game/cstrike_downloads /opt/cstrike/HLCS/game/cstrike


CONECTANDO


Entre no jogo novamente:

$ cd /opt/cstrike/HLCS
$ ./cstrike.sh


Faça o caminho novamente: New Game > de dust2 > Start > OK. Escolha as opções, por exemplo, 1 TERRORIST FORCES > 1 PHOENIX CONNEXION.

Tentaremos conectar em um servidor.

Dentro do jogo digite a tecla aspas_duplas/apóstrofo (",'): abrirá o console.

Lembrando que, para abrir o console, deve-se sempre abrir um New Game > etc > etc e entrar no jogo para depois conectar em um servidor.


Comandos:

cl_allowdownload 1
cl_allowupload 1
connect 91.211.247.221:27015


Obs.: depois veremos como tornar permanente os comandos cl_allowdownload 1 e cl_allowupload 1.

Caso você tiver sorte e completar a conexão de primeira, começará a baixar os arquivos e depois você entrará no CS1.6 online com outros jogadores de várias partes do mundo, agora é com você!

Caso aparecer uma mensagem: "SERVER IS FULL", parábens, você também é uma pessoa de sorte, pois realizou a conexão "de prima", porém, o servidor está cheio, aguarde e tente de novo mais tarde ou tente outro servidor.

Em alguns servidores pode demorar horas para baixar os arquivos da primeira vez (depende da conexão), depois é mais rápido em qualquer servidor, pois os arquivos, muitas vezes, são os mesmos.

Caso mudar de computador pode copiar a pasta /opt/cstrike/HLCS/game/cstrike.

Segue link para um site com uma porção de servidores espalhados pelo mundo (inclusive no Brasil), os quais você pode testar antes de realizar outros procedimentos.


Link geral:

https://www.gametracker.com/search/cs/


Link Brasil:

https://www.gametracker.com/search/cs/BR/


Caso terminar com "Disconnected Failed to contact game server", clique em "Close" para fechar a janela.

Caso terminar com "Cannot continue without model models/player/ugc_terror_vip/ugc_terror_vip.mdl, disconnecting.", feche a janela.

Você terá de ver o porquê não conectou.

Desligue o Firewall (se tiver), o Selinux, etc, para testar.

Sugestão de servidores (prontos para copiar e colar no console).


O formato é: "connect" seguido do IP e, depois dos dois pontos, a porta na qual o servidor atua:

connect 91.211.247.221:27015 (Omonas)
connect 93.114.82.202:27015 (Brasil ZMX League CS)
connect 5.199.130.133:27015 (Romênia)
connect 155.133.248.50:27015
connect 177.54.152.56:27015
connect 131.196.198.52:27052
connect 216.52.148.19:27011 (topfrag chicago)
connect 66.165.238.178:27018 (so-cal los angeles)
connect 45.32.174.155:27015 (dreampoint miami 1)
connect 172.96.172.86:27015 (dreampoint 2)
connect 172.96.172.84:27015 (dreampoint 3)
connect 172.96.172.84:27016 (dreampoint 4)


Caso, mesmo assim, não conseguir conexão de jeito nenhum, sugiro alguns procedimentos:

desabilite o firewall (se tiver), desabilite o Selinux e quaisquer módulos de segurança que, porventura, tenha no computador, somente para testar.

Caso tiver roteamento na sua máquina, desabilite para testar e identificar quem está bloqueando a conexão.

Além disso, tem provedores que utilizam CGNAT (Carrier Grade NAT) que é uma técnica usada por provedores de internet para compartilhar um único endereço IPv4 público entre vários clientes, contornando o esgotamento global de endereços IPv4. Vários usuários compartilham o mesmo IP público, mas cada um recebe um conjunto de portas lógicas diferentes e isso ocasiona problemas de NAT fechado em jogos, dificuldades no acesso remoto a câmeras/servidores, ou serviços de P2P.

As soluções para isso são:

1- Entrar em contato com o provedor para solicitar um IP público (cobrado geralmente);

2- Utilizar IPv6, que não precisa de NAT.

Contudo, nenhuma dessas é viável para muitos usuários de internet, mas vamos contornar isso na seção CONFIGURANDO.


OPCIONAL


TCPDUMP

Esta seção é OPCIONAL, caso queira, pode pular para a seção CONFIGURANDO:

Veja a placa de rede:

$ ip addr


Execute o jogo e com ele rodando abra outra janela do terminal e rode (substitua o nome da placa de rede enp3s0 pela sua):

$ sudo tcpdump -i enp3s0 -n udp port port (caso não tiver instale com sudo apt install tcpdump)


Exemplo:

$ sudo tcpdump -i enp3s0 -n udp port 27015




Caso der "Disconnected Failed to contact game server" e a saída do tcpdump der algo parecido com:

[sudo] senha para usuario: 
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp8s0f0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
10:00:02.357829 IP 172.16.5.99.27005 > 91.211.247.221:27015: UDP, length 23
10:00:08.360962 IP 172.16.5.99.27005 > 91.211.247.221:27015: UDP, length 23
10:00:14.360969 IP 172.16.5.99.27005 > 91.211.247.221:27015: UDP, length 23
10:00:20.377670 IP 172.16.5.99.27005 > 91.211.247.221:27015: UDP, length 23


Vemos que os pacotes estão tentando sair, mas tem algo bloqueando a volta, provavelmente o firewall, um proxy, o CGNAT, etc, pois não tem nenhum registro.

172.16.5.99.27005 < 91.211.247.221:27015: UDP, length 23

ou

91.211.247.221:27015 > 172.16.5.99.27005:num_porta: UDP, length 23.


No comando "sudo tcpdump -i enp3s0 -n udp port 27015" tenha o cuidado de colocar a sua placa de rede e coloque a porta correspondente ao connect do jogo, por exemplo, connect xxx.xxx.xxx.xxx:27052, connect xxx.xxx.xxx.xxx:27015, etc.

É de bom tom, de vez em quando, limpar o rastreador de conexões antes de abrir o jogo e executar o tcpdump:


$ sudo conntrack -F (se o comando não existir, instale com sudo apt install conntrack).


CONFIGURANDO

Caso tenha conseguido a conexão de primeira, as configurações que seguem são opcionais, contudo, aconselho a fazer até a seção "CloudflareWARP", exclusive - pois se você conseguiu a conexão "de prima" não precisa do CloudflareWARP -, mas depois configure o arquivo userconfig.cfg com as suas configurações pessoais (se souber o que está fazendo).


Vá em /opt/cstrike/HLCS/game/cstrike (ou o caminho que você escolheu para instalar) e altere o arquivo ServerBrowser.vdf:

$ cd /opt/cstrike/HLCS/game/platform/config/
$ cp ServerBrowser.vdf ServerBrowser.vdf.bkp
$ vim ServerBrowser.vdf


No início, substitua "internet" por "favorites", ficando assim:

"Filters"
{
    "gamelist" "favorites"
    "Filters"
    {
...


Salve e saia.


Retirando caracteres nulos e convertendo:

$ sed -i 's/\x0//g' ServerBrowser.vdf
$ dos2unix ServerBrowser.vdf


Crie o arquivo:

$ vim MasterServers.vdf


Coloque dentro:

"MasterServers"
{
    "0"
 { 
 "name" "Omona"
        "addr" "91.211.247.221:27015"
 }
    "1"
 { 
 "name" "ZMX League CS"
        "addr" "93.114.82.202:27015"
 }
    "2"
     {
        "name" "Romenia"
 "addr" "5.199.130.133:27015"
     }
    "3"
     {
        "name" "BR CSNaPegada DM"
        "addr" "131.196.196.44:27015"
     }
    "4"
     {
        "name" "BRXGames Fun"
        "addr" "177.54.151.114:27042"
     }
    "5"
     {
        "name" "BRXGames Pega Bandeira"
        "addr" "177.54.151.234:27030"
     }
    "6"
     {
        "name" "ClaN Brasilia"
        "addr" "177.54.152.56:27015"
     }
}


Salve e saia.


Altere a ordem do servidores masters como quiser.

Caso, futuramente, queira acrescentar/tirar servidores, edite o arquivo MasterServers.vdf e acrescente/tire os servidores desejados.

$ dos2unix MasterServers.vdf


Removendo todos os atributos ocultos do sistema e setando permissões:

$ cd
$ sudo chattr -i /opt/cstrike/HLCS/game/platform/config/ServerBrowser.vdf
$ sudo chattr -i /opt/cstrike/HLCS/game/platform/config/MasterServers.vdf
$ sudo chown -R $USER:$USER /opt/cstrike/HLCS/
$ chmod 644 /opt/cstrike/HLCS/game/platform/config/MasterServers.vdf
$ chmod 644 /opt/cstrike/HLCS/game/platform/config/ServerBrowser.vdf


CloudflareWARP

Agora vamos instalar o Cloudflare-Warp que é um serviço gratuito de Domain Name System (DNS) da empresa americana Cloudflare em parceria com a APNIC. O serviço funciona como um servidor de nomes recursivo fornecendo resolução de nomes de domínio para qualquer host na Internet.

Serve para vários jogos, downloads bloqueados pelo provedor, etc. Na seção SCRIPTS tem um script pronto que desliga o WARP.

Veremos o passo a passo para instalar no Debian.

Para outras distribuições veja o link:

https://pkg.cloudflareclient.com/


Adicione a chave e o repositório.

Adicionando cloudflare gpg key:

$ curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg | sudo gpg --yes --dearmor --output /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg


Adicionando o repo no repositório:

$ echo "deb [arch=amd64 signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare-client.list


Instalando:

$ sudo apt update && sudo apt install cloudflare-warp
$ sudo systemctl enable warp-svc
$ sudo systemctl start warp-svc


Registre o cliente (apenas na primeira vez):

$ warp-cli registration new

...
Accept Terms of Service and Privacy Policy? [y/N] y
Success


Conecte:

$ warp-cli connect

Success


Verificando o status:

$ warp-cli status

Status update: Connected

Network: healthy


$ ip addr

Na saída terá algo assim, podendo mudar a numeração dependendo de quantas placas de rede o vivente tem:

4: CloudflareWARP: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc mq state UNKNOWN group default qlen 500
    link/none 
    inet 172.16.0.2/32 scope global CloudflareWARP
       valid_lft forever preferred_lft forever
    inet6 2608:4710:111:879c:4b44:ebb:317a:cacb/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fd80::ca44:f9cc:aec0:681b/64 scope link stable-privacy proto kernel_ll 
       valid_lft forever preferred_lft forever


Geralmente o WARP cria uma interface chamada CloudflareWARP.

Você pode ver o tráfego passando por ela com:

$ sudo tcpdump -i CloudflareWARP -n udp


Se a interface não aparecer é porque algumas distribuições Linux precisam que o módulo "tun" do kernel esteja carregado.

$ sudo modprobe tun
$ sudo systemctl restart warp-svc
$ warp-cli connect


Para tornar permanente:

$ sudo vim /etc/modules-load.d/modules.conf

Acrescente no final o nome do módulo: tun.

Salve e saia.

Reinicie o gerenciador de internet e tente de novo "ip addr".


Começando:

$ warp-cli disconnect
$ warp-cli mode warp
$ warp-cli connect


Criando o diretório para armazenar os Favoritos e Servidores Masters:

$ mkdir -p "$HOME/.hlcs/platform/config"
$ cp /opt/cstrike/HLCS/game/platform/config/ServerBrowser.vdf ~/.hlcs/platform/config/
$ cp /opt/cstrike/HLCS/game/platform/config/MasterServers.vdf ~/.hlcs/platform/config/


Faz symlink de /opt/cstrike/HLCS/game/platform/config e garante persistência:

$ ln -s ~/.hlcs/platform/config /opt/cstrike/HLCS/game/platform/config


Criando o script cstrike_com.sh

$ cd /opt/cstrike/HLCS
$ vim cstrike_com.sh


Coloque dentro:

#!/bin/bash
# Script que roda e conecta o CS1.6 com WARP

# Otimiza o MTU da interface
sudo ip link set dev CloudflareWARP mtu 1280

# Limpa a rota anterior e fixa com o IP CloudflareWARP
sudo ip route add 131.196.198.52 dev CloudflareWARP 2>/dev/null

export SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
export DIR="$(dirname "$SCRIPT")"

cd "$DIR/game"

# Executa o jogo usando o tunel
# -window: abre em modo janela
# -w 1024 -h 768: define o tamanho da janela
# -nomousegrab: evita que o mouse fique preso
#./hl_linux -game cstrike -nomousegrab -ip 0.0.0.0 +clientport 27005
# Pode colocar -ip 0.0.0.0 no lugar de -ip 172.16.0.2

"$DIR/steam-runtime/run.sh" ./hl_linux -game cstrike -window -w 1024 -h 768 -nomousegrab -nofbo -nomsaa -gl_clear 1 -windowed -gl -ip 0.0.0.0 +clientport 27005


Salve e saia.


$ dos2unix cstrike_com.sh
$ chmod +x cstrike_com.sh


Execute o script cstrike_com.sh (deve ser executado como usuário):

$ ./cstrike_com.sh


Sempre faça o procedimento de New Game > Escolher um map > Start > etc, até entrar no jogo para depois conectar no servidor.

Abra o console digitando a tecla aspas_duplas/apóstrofo ("').

Em outro terminal rode, caso quiser:

$ sudo tcpdump -i CloudflareWARP -n udp


Tente uma conexão no console do jogo, por exemplo:

cl_allowdownload 1
cl_allowopload 1
connect 91.211.247.221:27015


Agora é contigo!!!

Caso der "Server is full" vá tentando outro servidor.

Em alguns servidores pode demorar horas para baixar os arquivos da primeira vez (depende da conexão), depois é mais rápido em qualquer servidor, pois os arquivos, muitas vezes, são os mesmos.


Caso mudar de computador pode copiar a pasta /opt/cstrike/HLCS/game/cstrike.

Na saída do tcpdump, caso estiver usando, procure algo assim:


10:59:20.103549 IP 162.159.200.123.123 > 172.16.1.22.52574: NTPv4, Server, length 48
10:59:23.018999 IP 172.16.1.22.27005 > 93.114.82.202:27015: UDP, length 23
10:59:23.179207 IP 91.211.247.221:27015 > 172.16.1.22.27005: UDP, length 32
10:59:23.202248 IP 172.16.1.22.27005 > 91.211.247.221:27015: UDP, length 452
10:59:23.360583 IP 91.211.247.221:27015 > 172.16.1.22.27005: UDP, length 40
10:59:23.402670 IP 172.16.1.22.27005 > 91.211.247.221:27015: UDP, length 16


Terá ida e volta:

172.16.0.2.27005 > 91.211.247.221:27015 (SAINDO)

91.211.247.221:27015 > 172.16.0.2.27005 (ENTRANDO)


Para remover:

$ sudo apt purge cloudflare-warp
$ sudo rm -rf /etc/cloudflare-warp
$ sudo rm -rf /var/lib/cloudflare-warp


ESTUDO DE CASOS

Os comandos apresentados não serão explicados, você pode (e deve, se quiser) pesquisar o significado de cada um. A internet é auto-explicativa.


1) Caso tiver proxy na rede e não dê para desabilitá-lo, teste mudando de modo WARP para PROXY, por exemplo:

$ warp-cli disconnect
$ warp-cli mode proxy
$ warp-cli connect


Para voltar:

$ warp-cli disconnect
$ warp-cli mode warp
$ warp-cli connect


Mas o modo WARP deve bastar.

Para ver mais opções:

$ warp-cli --help


2) Caso aparecer a mensagem "Sorry, no-steam p48 clients are not allowed on this server", significa que o servidor de Counter-Strike 1.6 que você está tentando acessar bloqueia jogadores que usam versões "piratas" (No-Steam) com um protocolo de rede antigo (p48, ou protocolo 48), uma vez que versões piratas (No-Steam) são mais fáceis de burlar e não possuem verificação de integridade oficial (VAC - Valve Anti-Cheat).

No nosso caso significa somente que a versão do CS é muito antiga (32 Bits), a 1.6.



3) Caso aparecer uma mensagem dizendo "Cannot continue without model models/player/ugc_terror_vip/ugc_terror_vip.mdl, disconnecting.", feche ela e execute no console do jogo (caso não quiser copiar e colar, basta digitar as primeiras letras que o console abrirá o leque de opções):

cl_allowdownload 1
cl_allowupload 1
setmaster enable 1
setmaster add xxx.xxx.xxx.xxx:xxxx
sv_lan 0
region 255
heartbeat




Especialmente no servidor "5.199.130.133:27015" que aparece essa mensagem.

Caso isso persistir, tente conectar utilizando o CloudflareWARP com seu respectivo script.

Caso ainda assim persistir, baixe a pasta "cstrike" de:

https://drive.google.com/drive/folders/1X4nTQ_Nd5mG9KQg4x_tm2IEjZmHZGOnh?usp=sharing


Copie a pasta para /opt/cstrike/HLCS/game, substituindo a pasta de mesmo nome que está ali.

Depois que você colocar manualmente, esse loop deve parar. Mas, se ao tentar conectar você ainda vir essas mensagens viciadas, digite isso no console para "resetar" a pilha de rede do jogo:

clcli
clientport 27005
net_resend 3
reconnect


4) Estando atrás de um PFSense numa rede interna, provavelmente não conseguirá jogar em alguns servidores.

Primeiro tente fixando os DNSs no arquivo /etc/resolv.conf, por exemplo:

nameserver 1.1.1.1
nameserver 8.8.8.8


Caso persistir, peça para o Administrador do pfSense...

Criar Regra de NAT Estático:

Ir em Firewall > NAT > Outbound.

Mudar o modo para Hybrid Outbound NAT (se estiver em Automatic).


Criar uma Mapping Rule no topo:

Interface: WAN

Protocol: UDP

Source: [Seu IP Local ou o Alias do seu PC]

Source Port: Any (ou 27000-27030)

Destination: Any

Translation/target: Marcar a caixa [x] Static Port.


Sem o Static Port, o pfSense faz o "Source Port Remap". O servidor envia os dados do jogo de volta para a porta X, mas o seu PC está ouvindo na porta Y. Isso causa o erro de "Reliable channel overflow" ou pings instáveis.

Ajuste de MTU/MSS (Opcional se o Lag continuar):

Se o download de outros arquivos continuar falhando, peça para ele verificar se há um MSS Clamping ativo em Interfaces > WAN. Para redes com túneis (como o WARP), setar o MSS para 1300 costuma estabilizar o tráfego fragmentado.


5) Exemplo de regras para liberar no firewall, principalmente as portas nas chains input e output.

O exemplo é com o NFTables, mas é somente um exemplo onde você deve mudar/acrescentar regras para seu cenário específico, não copie e cole essas regras como elas estão, pois pode acontecer de perder o acesso à internet:

table inet filter {

    chain input {
        type filter hook input priority 0; policy drop;

        # Loopback
        iif lo accept

        # Conexoes ja estabelecidas
 ct state invalid drop
        ct state established,related accept
        tcp dport { 22, 80, 443 } ct state new accept

        # DHCP
        udp dport {67,68} accept

        # Portas abertas jogo
        udp dport 27000-28015 accept

  ip protocol icmp accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;

        # Conexoes ja estabelecidas
 ct state invalid drop
        ct state established,related accept
    
 # DHCP
 udp dport {67,68} accept

 # Portas abertas jogo
        udp dport 27000-28015 accept

 ip protocol icmp accept
    }

   chain output {
        type filter hook output priority 0; policy drop;

        # Conexoes ja estabelecidas
 ct state invalid drop
        ct state established,related accept
 tcp dport { 22, 80, 443 } ct state new accept

        # DNS
        udp dport 53 accept
        tcp dport 53 accept

        # NTP/NTS
        udp dport 123 accept
        tcp dport 4460 accept

        # DHCP (cliente, se aplicavel)
        udp dport 67 accept
        udp sport 68 accept

 ip protocol icmp accept
    }


SCRIPTS

1) fechar_cs.sh

#!/bin/bash

echo "Encerrando o Counter-Strike e limpando o ambiente..."

# 1. Mata o processo do jogo e do carregador
pkill -9 hl_linux
pkill -9 hl.sh

# 2. Desconecta o Cloudflare WARP
warp-cli disconnect

# 3. Mata o Xephyr (caso tenha ele, descomente)
# pkill -9 Xephyr

# 4. Restaura o MTU da placa física para o padrão (1500)
# Ajuste para tua placa de rede
sudo ip link set dev enp3s0 mtu 1500

echo "Túnel WARP desligado. Internet restaurada para o padrão!"


Salve e saia.


Dando permissão de execução:

$ dos2unix ~/fechar_cs.sh
$ sudo chmod +x ~/fechar_cs.sh


2) cstrike_com.sh

#!/bin/bash
# Script que roda e conecta o CS1.6 com WARP

# Otimiza o MTU da interface
sudo ip link set dev CloudflareWARP mtu 1280

# Limpa a rota anterior e fixa com o IP CloudflareWARP
sudo ip route add 131.196.198.52 dev CloudflareWARP 2>/dev/null

export SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
export DIR="$(dirname "$SCRIPT")"

cd "$DIR/game"

# Executa o jogo usando o tunel
# -window: abre em modo janela
# -w 1024 -h 768: define o tamanho da janela
# -nomousegrab: evita que o mouse fique preso
#./hl_linux -game cstrike -nomousegrab -ip 0.0.0.0 +clientport 27005
# Pode colocar -ip 0.0.0.0 no lugar de -ip 172.16.0.2
"$DIR/steam-runtime/run.sh" ./hl_linux -game cstrike -window -w 1024 -h 768 -nomousegrab -nofbo -nomsaa -gl_clear 1 -windowed -gl -ip 0.0.0.0 +clientport 27005

Salve e saia e dê permissão de execução.


Para criar um ícone na área de trabalho do Debian 13, vamos criar um arquivo .desktop. Isso permitirá que você abra o jogo como qualquer outro aplicativo do sistema, sem precisar abrir o terminal.

Abra o terminal e crie o arquivo na sua pasta de Área de Trabalho:

$ vim ~/Área\ de\ Trabalho/CounterStrike.desktop


Coloque dentro:

[Desktop Entry]
Name=Counter-Strike 1.6
Comment=Jogar CS 1.6 no Debian 13 via WARP
Exec=bash -c "/opt/cstrike/HLCS/game/cstrike.sh"
Icon=/opt/cstrike/HLCS/game/cstrike.ico
Terminal=false
Type=Application
Categories=Game;

Nota: Se você não tiver um arquivo .ico, pode usar o caminho /usr/share/icons/gnome/48x48/devices/input-gaming.png para um ícone genérico.

$ chmod +x ~/Área\ de\ Trabalho/CounterStrike.desktop


Como agora você vai abrir pelo ícone, certifique-se de que o seu script cstrike_com.sh comece garantindo que o WARP esteja conectado automaticamente:

#!/bin/bash
# Garante que o WARP está ligado antes do jogo
warp-cli connect
sleep 2

# ... restante do seu script (caminhos, bibliotecas e execução) ...


Você também pode criar um atalho para o seu script de fechar (fechar_cs.sh) seguindo os mesmos passos acima ou simplesmente rode o comando warp-cli disconnect para liberar a internet para outros usos (como streaming/downloads pesados) quando terminar a jogatina.


3) cstrike_sem.sh

#!/bin/bash

# Script que conecta CS1.6 sem WARP

export SCRIPT="$(readlink -f "${BASH_SOURCE[0]}")"
export DIR="$(dirname "$SCRIPT")"

cd "$DIR/game"

# Para executar em tela cheia basta tirar -window -w 1024 -h 768
"$DIR/steam-runtime/run.sh" ./hl.sh -game cstrike -window -w 1024 -h 768

Salve, saia e dê permissão de execução.

Pode criar um atalho na área de trabalho também ficando com três ícones: um para entrar no CS1.6 pelo WARP, outro sem o WARP e outro para fechar o CS.


CONCLUSÃO

Os procedimentos aqui foram puramente didáticos porque para jogar CS online gratuito basta entrar no link:

https://play-cs.com/pt/servers


Escolher um servidor com o "map" desejado e conectar.


Para remover:

$ cd /opt/cstrike
$ sudo rm -rf HLCS


Descompacte novamente e reinicie o processo após a descompactação.


Configurações pessoais


$ vim /opt/cstrike/HLCS/game/cstrike/userconfig.cfg

// ====================================
// Configurações permanentes do jogador
// ====================================

// Downloads
cl_allowdownload 1
cl_download_ingame 1
cl_allowupload 0

// --------------------
// PERFORMANCE / FPS
// --------------------
fastsprites 0
fps_max 101
fps_override 0
gl_vsync 0
gl_overbright 0
gl_polyoffset 0
gl_monolights 1
gl_dither 0
r_detailtextures 0
mp_decals 20
r_decals 20
cl_showfps 1

// Mouse
m_filter 1
m_rawinput 1
m_customaccel 0
sensitivity 2.5
m_pitch 0.022
m_yaw 0.022
lookstrafe 0
lookspring 0

// Rede
rate 25000
cl_cmdrate 101
cl_updaterate 101
cl_cmdbackup 2
cl_interp 0
cl_interp_ratio 1
cl_lc 1
cl_lw 1
cl_dlmax 1024
cl_timeout 60

// --------------------
// HUD / VISUAL LIMPO
// --------------------
cl_himodels 0
cl_minmodels 1
cl_shadows 0
cl_weather 0
hud_fastswitch 1
hud_centerid 0
net_graph 3
net_scale 5

// --------------------
// SOM (CLARO E PRECISO)
// --------------------
hisound 1
snd_noextraupdate 1
_snd_mixahead 0.1
room_off 1
voice_enable 1
voice_scale 0.75

// --------------------
// MISC / QUALIDADE DE VIDA
// --------------------
cl_dynamiccrosshair 1
cl_crosshair_translucent 1
developer 0
con_mono 0
console 1


Salve e saia.


$ dos2unix /opt/cstrike/HLCS/game/cstrike/userconfig.cfg


O arquivo acima deve ser utilizado com cuidado.

Comece testando com somente os três parâmetros da seção Downloads, depois vá acrescentando e testando.

As configurações feitas no console sobrescrevem temporariamente o arquivo /opt/cstrike/HLCS/game/cstrike/config.cfg, o userconfig.cfg é o arquivo persistente.

Qualquer configuração deve ser feita somente nele.

Se mudar algo no console do jogo, o userconfig.cfg continua intacto.

No jogo você pode conversar com outros malucos.

SHALL WE PLAY A GAME?