Este repositório contém o código-fonte de vários instaladores de Client SA:MP (San Andreas Multiplayer) desenvolvidos pela SPC (SA-MP Programming Community). Esses instaladores foram criados para fornecer alternativas seguras e confiáveis aos instaladores originais do mod, que não são mais considerados confiáveis.
- Deutsch: README
- English: README
- Español: README
- Français: README
- Italiano: README
- Polski: README
- Русский: README
- Svenska: README
- Türkçe: README
- clients-samp
O projeto tem como objetivo fornecer instaladores seguros e confiáveis para diferentes versões do mod SA:MP. Cada instalador é desenvolvido em C# usando Windows Forms, oferecendo uma interface moderna e amigável com suporte a múltiplos idiomas e uma janela com as redes sociais.
O repositório inclui as seguintes versões de Client:
samp-client-dl-r1
: Instalador do Client DL R1samp-client-r1
: Instalador do Client R1samp-client-r1-voip
: Client R1 com integração SAMPVOICEsamp-client-r2
: Instalador do Client R2samp-client-r3
: Instalador do Client R3samp-client-r3-voip
: Client R3 com integração SAMPVOICEsamp-client-r4
: Instalador do Client R4samp-client-r5
: Instalador do Client R5
Cada versão do Client segue uma estrutura de projeto consistente:
clients-samp/
└── samp-client-v/
├── archives/
│ └── samp-client-{v}.zip
├── icons/
│ ├── languages/
│ │ └── [ícones de bandeiras dos idiomas]
│ └── social/
│ └── [ícones de redes sociais]
├── src/
│ ├── Core/
│ │ └── InstallerClient.cs
│ ├── Models/
│ │ └── Colors.cs
│ ├── Services/
│ │ ├── FileExtraction.cs
│ │ ├── Language.cs
│ │ ├── LanguageMapping.cs
│ │ └── SocialNetworks.cs
│ └── UI/
│ └── CustomProgressBar.cs
├── translations/
│ └── [30 arquivos XML de idiomas]
├── adm.manifest
├── compile.bat
├── Main.cs
└── samp-client-{v}.csproj
- Suporte a múltiplos idiomas (30 idiomas)
- Interface de usuário moderna e intuitiva
- Extração e instalação segura de arquivos
- Validação do diretório do jogo
- Acompanhamento do progresso em tempo real
- Janela com as redes sociais
- Assinatura de assembly opcional para segurança aprimorada
- Barra de progresso personalizada com animações
- Esquema de cores e estilo consistentes
- Acesse a página de releases do projeto
- Baixe a versão mais recente do Client já compilada
- Execute e prossiga para os procedimentos
- SDK .NET 9.0 ou superior
- Sistema operacional Windows
- Visual Studio 2022 ou superior (opcional)
- Visual Studio Code (opcional)
A maneira mais fácil de compilar qualquer versão do Client é usando o arquivo batch fornecido:
- Abra um terminal no diretório da versão do Client
- Execute o comando de compilação:
.\compile
Você também pode compilar diretamente usando o CLI do .NET:
dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true -p:EnableCompressionInSingleFile=true -o ./published
Note
Este comando irá gerar um arquivo executável único e otimizado para Windows 64-bit, contendo todas as dependências necessárias. O executável será criado dentro da pasta published
no diretório do projeto.
O formulário principal que gerencia todo o processo de instalação. Implementa uma interface de assistente passo a passo:
public partial class Installer_Client : Form
{
// Módulos principais
private File_Extraction Extraction_Module;
private Language Language_Module;
private Language_Mapping LanguageMapping_Module;
private Social_Networks SocialNetworks_Module;
// Elementos da interface
private Label Description_Label, Status_Label;
private Custom_ProgressBar Progress_Bar;
private ListBox ExtractedFiles_List;
}
Principais recursos e responsabilidades:
-
Seleção de Idioma
private void CreateLanguage_Buttons() { // Cria uma grade de botões de idioma com bandeiras Panel Button_Panel = new Panel { AutoScroll = true, Dock = DockStyle.None, Location = new Point(0, 140), Width = this.ClientSize.Width, Height = this.ClientSize.Height - 140 }; // Criação dinâmica de botões com bandeiras for (int i = 0; i < Available_Languages.Count; i++) { var Language = Available_Languages[i]; var Language_Button = CreateLanguage_Button(Language, Icon_Size, Button_Width, Button_Height, i, MaxButtons_PerRow, Padding); Button_Panel.Controls.Add(Language_Button); } }
-
Seleção do Diretório de Instalação
private void Selecting_Folder() { // Diálogo de seleção de pasta com validação using var Dialog = new FolderBrowserDialog(); if (Dialog.ShowDialog() == DialogResult.OK) { Selected_Path = Dialog.SelectedPath; // Valida o diretório de instalação do GTA:SA if (Path.GetFileName(Selected_Path) != "Grand Theft Auto San Andreas") { Status_Label.Text = Translate("invalid_folder"); Status_Label.ForeColor = Color.Red; } } }
-
Processo de Extração de Arquivos
private async Task<List<string>> ExtractClient_Files() { var progress = new Progress<(int progress, string fileName)>(update => { Progress_Bar.Value = update.progress; ExtractedFiles_List.Items.Add(update.fileName); }); return await Extraction_Module.ExtractClient_Files(Selected_Path, progress); }
-
Janela com as Redes Sociais
private void ShowSocial_Networks() { string[] Social_Networks = { "Discord SPC", "YouTube", "Instagram", "TikTok", "GitHub" }; // Cria botões para cada rede social com ícones for (int i = 0; i < Social_Networks.Length; i++) { var Social_Button = CreateSocial_NetworkButton(Social_Networks[i], Icon_Size, Button_Width, Button_Height, i, Padding); Controls.Add(Social_Button); } }
Gerencia a extração segura dos arquivos do Client SA:MP dos recursos incorporados:
public class File_Extraction
{
public async Task<List<string>> ExtractClient_Files(string Target_Path, IProgress<(int progress, string fileName)> progress)
{
// Carrega o recurso ZIP incorporado
var Current_Assembly = Assembly.GetExecutingAssembly();
var Zip_Resource = Current_Assembly.GetManifestResourceNames().FirstOrDefault(Res => Res.Contains("archives") && Res.EndsWith("samp-client-v.zip"));
using var Zip_Archive = new ZipArchive(Temp_Buffer, ZipArchiveMode.Read);
var Total_Files = Zip_Archive.Entries.Count;
var Processed_Files = new List<string>();
// Extrai arquivos com relatório de progresso
for (int File_Index = 0; File_Index < Total_Files; File_Index++)
{
var Current_Entry = Zip_Archive.Entries[File_Index];
var File_Target_Path = Path.Combine(Target_Path, Current_Entry.FullName);
// Relata progresso para atualizações da interface
int Completion_Percent = (int)((File_Index + 1) * 100.0 / Total_Files);
progress.Report((Completion_Percent, Current_Entry.FullName));
}
return Processed_Files;
}
}
Gerencia o sistema de suporte a múltiplos idiomas usando recursos XML:
public class Language
{
private Dictionary<string, string> Translation_Dictionary = new();
public List<string> GetAvailable_Languages()
{
var Current_Assembly = Assembly.GetExecutingAssembly();
Available_Languages = Current_Assembly.GetManifestResourceNames().Where(Resource => Resource.Contains("translations") && Resource.EndsWith(".xml"))
.Select(Resource => Path.GetFileNameWithoutExtension(Resource.Split('.').ElementAt(Resource.Split('.').Length - 2))).ToList();
return Available_Languages;
}
public void Load_Translations(string Language_Name)
{
// Carrega e analisa o arquivo XML de tradução
using var Resource_Stream = Current_Assembly.GetManifestResourceStream(Resource_Name);
var XML_Document = XDocument.Load(Resource_Stream);
Translation_Dictionary = XML_Document.Descendants("string").ToDictionary(Element => Element.Attribute("key")?.Value ?? string.Empty, Element => Element.Value);
}
}
Gerencia o mapeamento entre nomes de idiomas e seus códigos de imagem de bandeira correspondentes:
public class Language_Mapping : Language_Mapping_II
{
private readonly Dictionary<string, string> LanguageTo_ImageCode;
public Language_Mapping()
{
LanguageTo_ImageCode = new Dictionary<string, string>
{
{ "English", "en" },
{ "Português", "pt" },
{ "Español", "es" }
// Mapeamentos adicionais de idiomas...
};
}
public string GetImage_Code(string Language_Name) =>
LanguageTo_ImageCode.TryGetValue(Path.GetFileNameWithoutExtension(Language_Name), out var Code) ? Code : Language_Name.ToLower();
}
Gerencia a abertura de links de redes sociais no navegador padrão:
public class Social_Networks
{
public void OpenSocial_Network(string Network_Name)
{
string Network_Url = Network_Name switch
{
"Discord SPC" => "https://discord.gg/3fApZh66Tf",
"YouTube" => "https://youtube.com/@spc-samp",
// Mapeamentos adicionais de redes...
_ => ""
};
if (!string.IsNullOrEmpty(Network_Url))
{
Process.Start(new ProcessStartInfo
{
FileName = Network_Url,
UseShellExecute = true
});
}
}
}
Uma barra de progresso altamente personalizada com animações e estilo moderno:
public class Custom_ProgressBar : ProgressBar
{
// Propriedades de personalização
public Color GradientStart_Color { get; set; }
public Color GradientEnd_Color { get; set; }
public int Animation_Speed { get; set; }
public int Corner_Radius { get; set; }
public bool Show_Percentage { get; set; }
protected override void OnPaint(PaintEventArgs e)
{
// Implementa desenho personalizado com gradientes e animações
using (var Path = GetRounded_Rectangle(Progress_Rect, Corner_Radius_II))
using (var Gradient = new LinearGradientBrush(Progress_Rect, GradientStart_Color_II, GradientEnd_Color_II, LinearGradientMode.Horizontal))
{
// Aplica mistura de cores para transições suaves
ColorBlend Blend = new ColorBlend();
Blend.Positions = Positions;
Blend.Colors = Colors;
Gradient.InterpolationColors = Blend;
// Aplica animação de rotação
Matrix Matrix = new Matrix();
Matrix.RotateAt(Animation_Step, new PointF(Progress_Rect.Left + Progress_Rect.Width / 2, Progress_Rect.Top + Progress_Rect.Height / 2));
Gradient.MultiplyTransform(Matrix);
e.Graphics.FillPath(Gradient, Path);
}
}
}
Define o esquema de cores da aplicação:
public static class Colors_Client
{
public static readonly Color Background = Color.FromArgb(32, 34, 37);
public static readonly Color Secondary = Color.FromArgb(47, 49, 54);
public static readonly Color Accent = Color.FromArgb(0, 139, 139);
public static readonly Color Text = Color.White;
public static readonly Color Hover = Color.FromArgb(64, 68, 75);
}
O instalador requer privilégios administrativos para instalar corretamente os arquivos do SA:MP no diretório do GTA:SA. Isso é gerenciado através do arquivo adm.manifest
:
<?xml version="1.0" encoding="utf-8"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
</requestedPrivileges>
</security>
</trustInfo>
</assembly>
Principais recursos da execução administrativa:
- Garante permissões adequadas de arquivo para instalação
- Permite modificação de diretórios protegidos do sistema
- Gerencia automaticamente prompts do UAC (Controle de Conta de Usuário)
- Necessário para modificações no registro, se necessário
Para habilitar a execução administrativa, o arquivo de manifesto é referenciado no arquivo do projeto:
<PropertyGroup>
<ApplicationManifest>adm.manifest</ApplicationManifest>
</PropertyGroup>
O projeto suporta assinatura de nome forte para segurança aprimorada. Isso pode ser habilitado no arquivo do projeto:
<PropertyGroup>
<SignAssembly>true</SignAssembly>
<AssemblyOriginatorKeyFile>MyKey.snk</AssemblyOriginatorKeyFile>
</PropertyGroup>
Para gerar uma chave de nome forte:
sn -k MyKey.snk
Benefícios da assinatura de assembly:
- Garante a integridade do assembly
- Previne adulteração do assembly
- Fornece identidade única ao assembly
- Permite implantação no GAC
- Suporta implantação ClickOnce
Note
Mantenha seu arquivo de chave de nome forte (*.snk) seguro e nunca o submeta ao controle de fonte.
As traduções são armazenadas em arquivos XML com a seguinte estrutura:
<translations>
<string key="continue">Prosseguir</string>
<string key="cancel">Cancelar</string>
<string key="finish">Concluir</string>
<string key="close">Fechar</string>
<!-- Traduções adicionais -->
</strings>
A classe Language
carrega essas traduções dinamicamente:
public string Translate(string Key) =>
Translation_Dictionary.TryGetValue(Key, out var Value) ? Value : Key;
As bandeiras dos idiomas são armazenadas como recursos incorporados e carregadas dinamicamente:
private Bitmap GetFlag_Image(string Language, int Icon_Size)
{
var Image_Code = LanguageMapping_Module.GetImage_Code(Language);
var Flag_Resource_Name = Get_Assembly.GetManifestResourceNames().FirstOrDefault(r => r.Contains("icons.languages") && r.EndsWith($"{Image_Code}.png"));
if (Flag_Resource_Name != null)
{
using var Stream = Get_Assembly.GetManifestResourceStream(Flag_Resource_Name);
return new Bitmap(Image.FromStream(Stream), new Size(Icon_Size, Icon_Size));
}
return null;
}
O arquivo .csproj
é um componente crucial do projeto, que define as configurações e propriedades fundamentais da aplicação. Abaixo está a estrutura detalhada das principais configurações utilizadas:
<PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net9.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<ApplicationManifest>adm.manifest</ApplicationManifest>
<ApplicationIcon>icons\social\ico-spc.ico</ApplicationIcon>
</PropertyGroup>
OutputType
: Define o tipo de saída como um executável WindowsTargetFramework
: Especifica a versão do .NET Framework utilizada (9.0)UseWindowsForms
: Habilita o uso de Windows Forms para a interface gráficaApplicationManifest
: Define o manifesto da aplicação para permissões administrativasApplicationIcon
: Define o ícone principal da aplicação
<PropertyGroup>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
<Company>SA-MP Programming Community</Company>
<Product>samp-client-v</Product>
<Copyright>Copyright © SPC</Copyright>
<Description>Instalador do mod (San Andreas Multiplayer) versão 0.3.7 V.</Description>
</PropertyGroup>
AssemblyVersion
: Versão do assembly do projetoFileVersion
: Versão do arquivo executávelCompany
: Nome da empresa/organizaçãoProduct
: Nome do produtoCopyright
: Informações de direitos autoraisDescription
: Descrição do projeto
<PropertyGroup>
<RollForward>LatestMajor</RollForward>
<RuntimeFrameworkVersion>9.0.0</RuntimeFrameworkVersion>
</PropertyGroup>
RollForward
: Configura o comportamento de atualização do runtimeRuntimeFrameworkVersion
: Especifica a versão exata do runtime do .NET
<ItemGroup>
<EmbeddedResource Include="archives\**\*" />
<EmbeddedResource Include="icons\**\*" />
<EmbeddedResource Include="translations\**\*" />
</ItemGroup>
Esta seção define os recursos que serão incorporados no executável final:
archives
: Arquivos necessários para o instaladoricons
: Ícones e recursos visuaistranslations
: Arquivos de tradução para diferentes idiomas
- O projeto é configurado como um executável Windows Forms, adequado para criar uma interface gráfica de usuário.
- A aplicação é direcionada para o .NET 9.0, garantindo compatibilidade com as últimas funcionalidades do framework.
- Recursos como ícones, arquivos e traduções são incorporados diretamente no executável, facilitando a distribuição.
- As configurações de versão e informações da empresa são importantes para identificação do software.
Erros:
Copyright © SA-MP Programming Community
Este software é licenciado sob os termos da Licença Apache, Versão 2.0 ("Licença"); você não pode utilizar este software exceto em conformidade com a Licença. Uma cópia da Licença pode ser obtida em: Apache License 2.0
A presente licença concede, gratuitamente, a qualquer pessoa que obtenha uma cópia deste software e arquivos de documentação associados, os seguintes direitos:
- Utilizar, copiar, modificar e distribuir o software em qualquer meio ou formato, para qualquer finalidade, comercial ou não-comercial
- Mesclar, publicar, distribuir, sublicenciar e/ou vender cópias do software
- Permitir que pessoas para as quais o software é fornecido façam o mesmo
Todas as distribuições do software ou trabalhos derivados devem:
- Incluir uma cópia completa desta licença
- Indicar claramente quaisquer modificações realizadas no código-fonte original
- Preservar todos os avisos de direitos autorais, patentes, marcas registradas e atribuições
- Fornecer documentação adequada das alterações implementadas
- Manter o aviso de licença e garantia em todas as cópias
- Esta licença não concede permissão para uso de marcas registradas, logotipos ou nomes comerciais da SA-MP Programming Community
- As contribuições para o código-fonte devem ser licenciadas sob os mesmos termos desta licença
- O uso de nomes dos contribuidores para endossar ou promover produtos derivados deste software requer permissão prévia específica
O software e toda a documentação associada são protegidos por leis de direitos autorais e tratados internacionais. A SA-MP Programming Community retém todos os direitos, títulos e interesses não expressamente concedidos por esta licença.
O SOFTWARE É FORNECIDO "COMO ESTÁ", SEM GARANTIAS DE QUALQUER NATUREZA, EXPRESSAS OU IMPLÍCITAS, INCLUINDO, MAS NÃO SE LIMITANDO A, GARANTIAS DE COMERCIALIZAÇÃO, ADEQUAÇÃO A UM PROPÓSITO ESPECÍFICO E NÃO VIOLAÇÃO.
EM NENHUMA CIRCUNSTÂNCIA OS AUTORES OU TITULARES DOS DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUAISQUER REIVINDICAÇÕES, DANOS OU OUTRAS RESPONSABILIDADES, SEJA EM AÇÃO DE CONTRATO, DELITO OU DE OUTRA FORMA, DECORRENTES DE, OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO SOFTWARE.
Para informações detalhadas sobre a Licença Apache 2.0, consulte: http://www.apache.org/licenses/LICENSE-2.0