diff --git a/.github/documentation/localization/GettingStarted-BR.md b/.github/documentation/localization/GettingStarted-BR.md index 37b5f5b4f8..9159cecd10 100644 --- a/.github/documentation/localization/GettingStarted-BR.md +++ b/.github/documentation/localization/GettingStarted-BR.md @@ -1,21 +1,28 @@ -# Documento de Baixo Nível do Exiled -*(Escrito por [KadeDev](https://github.com/KadeDev) para a comunidade) (Traduzido por [Firething](https://github.com/Firething))* +# Tutorial do EXILED +*(Escrito por [KadeDev](https://github.com/KadeDev) para a comunidade, revisado e traduzido por [Unbistrackted](https://github.com/Unbistrackted) e [Firething](https://github.com/Firething))* ## Manual de Instruções ### Introdução -Exiled é uma API de baixo nível, o que significa que você pode chamar funções do jogo sem precisar de vários bloatwares de API. +Como dito anteriormente, o EXILED é uma framework de alto nível que permite a gente chamar funções do jogo sem ter nenhum tipo de complicação ou quase nenhuma perda de perfomance. -Isso permite com que o Exiled atualize-se facilmente, e ele pode ser atualizado antes mesmo da atualização chegar ao jogo. +Isso permite que o projeto seja atualizado de forma mais simples, sem precisar que desenvolvedores atualizem seus plugins! (Isso se não houver códigos que foram alterados/tornados obsoletos em versões majors do EXILED) -Isso também permite que desenvolvedores de plug-in não precisem atualizar seus códigos sempre que houver uma atualização do Exiled ou SCP:SL. Na realidade, eles nem precisarão atualizar seus plug-ins! +O guia a seguir irá te ensinar o básico de como criar seu primeiro plugin! -Esse documento mostrará a você os básicos de como se fazer um Plug-in para o Exiled. A partir daqui, você poderá mostrar ao mundo as coisas criativas que você pode criar com essa framework! +### Guia +O [Plug-in de Exemplo](https://github.com/ExMod-Team/EXILED/tree/master/EXILED/Exiled.Example) mostra o que são eventos e como criar eles de forma correta. Usar esse exemplo ajudará você a aprender a como usar o Exiled apropriadamente. Dentro desse existem elementos que são importantes, o quais abordaremos nessa guia. -### Exemplo de Plug-in -Um [Exemplo de Plug-in](https://github.com/ExMod-Team/EXILED/tree/master/EXILED/Exiled.Example) que é um plug-in simples que mostra eventos e como fazer eles adequadamente. Usar esse exemplo ajudará você a aprender a como usar o Exiled apropriadamente. Há alguns aspectos nesse plug-in que são importantes, falaremos sobre eles. +#### Atualizações Dinâmicas e ``OnEnable`` + ``OnDisable`` +O EXILED possuí um comando chamado **Reload**, que recarrega todos os plug-ins instalados. -#### Atualizações Dinâmicas em On Enable + On Disable -Exiled é uma framework que tem um comando de **Reload** que pode ser usado para recarregar todos os plug-ins e obter novos. Isso significa que você deve fazer com que seus plug-ins sejam **Dinamicamente Atualizáveis.** Isso significa que toda variável, evento, corrotina, etc *deve* ser atribuída quando ativada e anulada quando desativada. O método **On Enable** deve ativar todos, e o método **On Disable** deve desativar todos. Mas talvez você esteja se perguntando 'E o **On Reload**'? Essa função tem como objetivo carregar variáveis estáticas para que toda constante estática que você fizer não seja apagada. Então você poderia fazer algo assim: +Ele funciona desativando o plugin e ativando-o novamente, além de chamar a função ``OnReload`` que entraremos em detalhes abaixo. + +Lembrando que toda variável, evento, corrotina, etc. *deve* ser atribuído ou criado quando o plugin é ativado e anulada quando o mesmo é desativado. + +> [!IMPORTANT] +> Você **DEVE** usar o método ``OnEnable`` para ativar o Plug-in, e ``OnDisable`` desativa-lo. + +Mas talvez você deve estar se perguntando: "Mas então para que serve o ``OnReload``?" Essa função tem como objetivo recarregar as variáveis estáticas de dentro do seu plugin. Então você poderia fazer algo assim: ```csharp public static int StaticCount = 0; public int counter = 0; @@ -24,13 +31,13 @@ public override void OnEnable() { counter = StaticCount; counter++; - Info(counter); + Log.Info(counter); } public override void OnDisable() { counter++; - Info(counter); + Log.Info(counter); } public override void OnReload() @@ -41,34 +48,46 @@ public override void OnReload() E o resultado seria: ```bash -# On enable fires +# O servidor é iniciado... +# OnEnable é chamado. 1 -# Reload command -# On Disable fires +# Comando Reload é executado por alguém... +# OnDisable é chamado. 2 -# On Reload fires -# On Enable fires again +# OnReload é chamado. +"counter" é guardado dentro de "StaticCount" +# E então OnEnabled é chamado novamente. 3 ``` -(Claro, excluindo qualquer coisa além das respostas reais) -Sem fazer isso, teria ido apenas para o 1 e então para o 2 novamente. +Sem fazer isso, teria apenas mostrado no console ``1`` e então para o ``2`` novamente. ### Jogadores + Eventos -Agora que terminamos de fazer com que nossos plug-ins sejam **Dinamicamente Atualizáveis**, podemos focar em tentar interagir com jogadores por meio de eventos! +Agora que entendemos como plug-ins **Dinamicamente Atualizáveis** funcionam, podemos focar em tentar interagir com jogadores por meio de eventos! + +Um evento é uma forma do jogo notificar seu plug-in quando algo acontece, por exemplo quando um jogador entrar, tomar dano, morrer, etc. -Um evento é bem interessante, ele permite com que o SCP:SL se comunique com o Exiled e depois com o Exiled para todos os plug-ins! +> [!IMPORTANT] +> Você **PRECISA** referenciar o arquivo `Exiled.Events.dll` para que você consiga usar os eventos. (Ou apenas baixe o pacote [Nuget do Exiled](https://www.nuget.org/packages/ExMod.Exiled)!) + +Para começar a ouvir um evento, iremos utilizar uma nova classe chamada "EventHandlers", que irá gerenciar os nossos eventos. + +Na classe EventHandlers: -Você pode ouvir os eventos do seu plug-in adicionando isso à parte superior do arquivo de origem do plug-in principal: ```csharp -using EXILED; +public class EventHandlers +{ + public void PlayerVerified(VerifiedEventArgs ev) + { + // Códigos 1 + // Códigos 2 + // Códigos 3 + } +} ``` -E então você precisa referenciar o arquivo `Exiled.Events.dll` para que você realmente obtenha eventos. -Para referenciar um evento, nós estaremos utilizando uma nova classe que criamos; denominada "EventHandlers". O gerenciador de eventos não é fornecido por padrão; você deve criá-lo. - -Nós podemos referenciá-lo no void OnEnable e OnDisable assim: +E depois nós podemos referenciá-lo no ``OnEnable`` e ``OnDisable`` desse jeito: `MainClass.cs` ```csharp @@ -76,50 +95,38 @@ using Player = Exiled.Events.Handlers.Player; public EventHandlers EventHandler; -public override OnEnable() +public override void OnEnable() { - // Registre a classe de gerenciador de evento. E adicione o evento - // ao ouvinte de eventos 'EXILED_Events' para que obtenhamos o evento. EventHandler = new EventHandlers(); + // += significa que você vai estar se atribuindo ao evento, que nesse caso você vai ouvir toda vez que ele for chamado. Player.Verified += EventHandler.PlayerVerified; } -public override OnDisable() +public override void OnDisable() { - // Torne-o dinamicamente atualizável. - // Fazemos isso ao remover o ouvinte para o evento e então anulando o gerenciador de eventos. + // Precisamos desatribuir o evento e depois, anular o gerenciador de eventos. + // Esse processo deve ser repetido para cada evento. Player.Verified -= EventHandler.PlayerVerified; EventHandler = null; } ``` -E na classe EventHandlers, faríamos: +Agora toda vez que um jogador é autenticado após entrar no servidor podemos executar nosso código customizado! É importante destacar que todos eventos têm diferentes argumentos, e cada tipo tem propriedades diferentes associadas. -```csharp -public class EventHandlers -{ - public void PlayerVerified(VerifiedEventArgs ev) - { - - } -} -``` -Agora conseguimos nos conectar a um evento de jogador verificado que é executado sempre que um jogador é autenticado após entrar no servidor! É importante destacar que todos eventos têm diferentes argumentos de evento, e cada tipo de argumento de evento tem propriedades diferentes associadas. - -O EXILED já fornece uma função de aviso (broadcast), então a usaremos em nosso evento: +O EXILED já fornece uma função para enviar um broadcast, então a usaremos em nosso exemplo: ```csharp public class EventHandlers { public void PlayerVerified(VerifiedEventArgs ev) { - ev.Player.Broadcast(5, "Bem-vindo ao meu servidor maneiro!"); + ev.Player.Broadcast(5, "Bem-vindo(a) ao meu servidor!"); } } ``` -Como destacado acima, todo evento tem diferentes argumentos. Abaixo há um evento diferente que desliga os portões de Tesla para jogadores da Nine-Tailed Fox. +Outro exemplo seria um evento que desliga as Teslas para todos os MTFs. (Incluindo guardas) `MainClass.cs` ```csharp @@ -127,15 +134,15 @@ using Player = Exiled.Events.Handlers.Player; public EventHandlers EventHandler; -public override OnEnable() +public override void OnEnable() { EventHandler = new EventHandlers(); Player.TriggeringTesla += EventHandler.TriggeringTesla; } -public override OnDisable() +public override void OnDisable() { - // Não se esqueça, eventos devem ser desconectados e anulados no metódo Disable. + // Não se esqueça, eventos devem ser desatribuídos e anulados nesse metódo! Player.TriggeringTesla -= EventHandler.TriggeringTesla; EventHandler = null; } @@ -150,7 +157,7 @@ public class EventHandlers public void TriggeringTesla(TriggeringTeslaEventArgs ev) { // Desativa o evento para jogadores da equipe da Fundação. - // Isso pode ser feito ao verificar o lado (side) do jogador. + // Isso pode ser feito ao verificar o lado (side) da classe do jogador. if (ev.Player.Role.Side == Side.Mtf) { // Desative o acionamento da Tesla ao definir o ev.IsTriggerable para 'false'. // Jogadores que tiverem uma patente na FTM não irão mais ativar portões de Tesla. @@ -162,33 +169,37 @@ public class EventHandlers ### Configurações -A maioria dos plug-ins do Exiled contém configurações. As configurações permitem que os gerentes de servidor modifiquem os plug-ins livremente, embora sejam limitadas à configuração que o desenvolvedor do plug-in fornece. +Grande partes dos plug-ins precisam de configurações, isso permite que os donos de servidores modifiquem os plug-ins livremente. (Limitados as configurações que o desenvolvedor ofereceu) -Primeiro crie uma classe `config.cs` e mude a herança do seu plug-in de `Plugin<>` para `Plugin` +Primeiro crie uma classe chmada `Config` e mude a herança do seu plug-in de `Plugin<>` para `Plugin` -Agora você precisa fazer essa configuração herdar `IConfig`. Após herdar de `IConfig`, adicione uma propriedade para a classe titulada como `IsEnabled` e `Debug`. Sua classe de Configuração agora deve se assemelhar a isso: +Agora você precisa fazer essa classe herdar `IConfig`, e depois implementar o contrato dela criando `IsEnabled` e `Debug`. Sua classe de Configuração agora deve se assemelhar a isso: ```csharp public class Config : IConfig { - public bool IsEnabled { get; set; } + public bool IsEnabled { get; set; } = true; // Se você não colocar "= true", o seu plugin não sera habilitado quando o servidor iniciar! public bool Debug { get; set; } } ``` -Você pode adicionar qualquer opção de configuração ali e referenciá-la assim: +Você pode adicionar qualquer opção de configuração ali e referenciá-la assim: `Config.cs` ```csharp public class Config : IConfig { - public bool IsEnabled { get; set; } + public bool IsEnabled { get; set; } = true; public bool Debug { get; set; } - public string TextThatINeed { get; set; } = "esse é o padrão"; + public string TextThatINeed { get; set; } = "Texto para testes"; } ``` +> [!NOTE] +> Você não precisa verificar se `IsEnabled == true` ou não, o Loader já faz isso automaticamente. + `MainClass.cs` + ```csharp public override OnEnabled() { @@ -196,11 +207,11 @@ Você pode adicionar qualquer opção de configuração ali e referenciá-la ass } ``` -E parabéns! Você fez o seu primeiro Plug-in para o Exiled! É importante destacar que todos os plug-ins **devem** ter uma configuração IsEnabled. Essa configuração permite que donos de servidor ativem e desativem o plug-in quando quiserem. A configuração IsEnabled será lida pelo carregador do Exiled (seu plug-in não precisa verificar se `IsEnabled == true` ou não). +Pronto, agora você sabe fazer Plug-ins usando o Exiled! ### E agora? -Se você quiser mais informações, você deve entrar no nosso [discord!](https://discord.gg/PyUkWTg) +Se você quiser mais informações, entre no nosso [Servidor do Discord!](https://discord.gg/PyUkWTg) -Nós temos um canal de #resources que você pode considerar útil, assim como colaboradores do EXILED e desenvolvedores de plug-in que estariam dispostos a ajudá-lo na criação de seus plug-ins. +Nós temos um canal de #resources que você pode considerar útil, assim como vários outros desenvolvedores que iram te ajudar a desenvolver seus plug-ins! -Ou você poderia ler sobre todos os eventos que nós temos! Se você deseja verificá-los, veja [aqui!](https://github.com/ExMod-Team/EXILED/tree/master/EXILED/Exiled.Events/EventArgs) +Ou você poderia ler sobre todos os eventos que nós temos! Bem [aqui](https://github.com/ExMod-Team/EXILED/tree/master/EXILED/Exiled.Events/EventArgs)! diff --git a/.github/documentation/localization/README-BR.md b/.github/documentation/localization/README-BR.md index e6f6102b89..410a92e58d 100644 --- a/.github/documentation/localization/README-BR.md +++ b/.github/documentation/localization/README-BR.md @@ -11,98 +11,114 @@ -O EXILED é uma estrutura para plug-ins de alto nível aos servidores de SCP: Secret Laboratory. Ele oferece um sistema de eventos para os desenvolvedores usarem com o intuito de manipular, alterar o código do jogo ou implementar suas próprias funções. -Todos os eventos do EXILED são codificados com Harmony, o que significa que não requerem edição direta dos Assemblies do servidor para funcionar, o que permite dois benefícios exclusivos. +EXILED é um Framework de alto nível para a criação de plug-ins direcionado a servidores de SCP: Secret Laboratory. Ele oferece um sistema de eventos para os desenvolvedores, com o objetivo de manipular, alterar ou implementar suas próprias funcionalidades no jogo. +Todos os eventos do EXILED são feitos com [Harmony](https://harmony.pardeike.net/articles/intro.html), o que significa que não requerem edição direta dos Assemblies/Código Base do servidor para funcionar, permitindo dois benefícios: - - Em primeiro lugar, todo o código da estrutura pode ser publicado e compartilhado livremente, permitindo que os desenvolvedores entendam melhor *como* ele funciona, além de oferecer sugestões para adicionar ou alterar suas funções. - - Em segundo lugar, como todo o código relacionado à estrutura é feito fora da Assembly do servidor, coisas como pequenas atualizações do jogo terão pouco ou nenhum efeito na framework, tornando-a mais compatível com futuras atualizações do jogo, além de facilitar a atualização quando *for* necessário fazê-la. + - Todo o código do Framework pode ser publicado e compartilhado livremente, permitindo que os desenvolvedores entendam melhor *como* funciona, além de poderem sugerir adições ou alterações. + - Todo o código relacionado ao framework é executado fora do assembly do servidor, significando que pequenas atualizações do jogo provavelmente não causarão efeitos colaterais. Isso torna o projeto mais compatível, além de facilitar quando for necessário atualizá-lo. # Instalação -A instalação do EXILED é bastante simples. Ele se carrega por meio da API de plug-in da NW. É por isso que existem duas pastas dentro de ``Exiled.tar.gz`` nos arquivos de lançamento. ``SCP Secret Laboratory`` contém os arquivos necessários para carregar os recursos do EXILED na pasta ``EXILED``. Com isso dito, tudo o que você precisa fazer é mover essas duas pastas para o caminho adequado que é explicado abaixo, e pronto! +A instalação do EXILED é bem simples e você pode escolher entre dois tipos: ``Automática`` e ``Manual``. -Se você optar por usar o instalador, se executado corretamente, ele cuidará de instalar todos os recursos do EXILED. +Na instalação automática, o instalador cuidará de baixar todos os recursos e arquivos para que o EXILED funcione. + +Já na manual, você faz o download do ``Exiled.tar.gz`` nos arquivos do release, e há duas pastas dentro. +``SCP Secret Laboratory`` contém os arquivos necessários para carregar os recursos do EXILED de dentro da pasta ``EXILED``. Com isso em mente, tudo o que você precisa fazer é mover essas duas para o caminho adequado e pronto! + +Abaixo entraremos em mais detalhes... # Windows -### Instalação automática ([mais informações](https://github.com/ExMod-Team/EXILED/blob/master/EXILED/Exiled.Installer/README.md)) -**Nota**: Verifique se você está conectado ao usuário que executa o servidor ou se possui privilégios de administrador antes de executar o Instalador. +> [!IMPORTANT] +> Verifique se você está conectado no mesmo usuário do Windows que está executando o servidor ou se possui privilégios de administrador antes de executar o Instalador. - - Baixe o **`Exiled.Installer-Win.exe` [daqui](https://github.com/ExMod-Team/EXILED/releases)** (clique em Assets -> clique no Instalador) - - Coloque-o na pasta do seu servidor (baixe o servidor dedicado, caso não o tenha feito) +### Instalação automática ([mais informações](https://github.com/ExMod-Team/EXILED/blob/master/EXILED/Exiled.Installer/README.md)) + - Baixe **`Exiled.Installer-Win.exe` [aqui](https://github.com/ExMod-Team/EXILED/releases)** (clique em Assets -> clique no instalador) + - Coloque-o na pasta do seu servidor (Ele precisa estar dentro da pasta de um servidor "dedicado", caso não tenha siga [esse guia](https://techwiki.scpslgame.com/books/server-guides/page/1-how-to-create-a-dedicated-server)) - Clique duas vezes em **`Exiled.Installer.exe`** ou **[baixe este .bat](https://www.dropbox.com/scl/fi/7yh0r3q0vdn6ic4rhuu3l/install-prerelease.bat?rlkey=99fwjbwy1xg61qgtak0qzb9rd&st=8xs4xks8&dl=1)** e coloque-o na pasta do servidor para instalar o pré-lançamento mais recente - - Para instalar e obter plug-ins, confira a seção [Instalando plug-ins](#installing-plugins) abaixo. -**Nota:** Se você estiver instalando o EXILED em um servidor remoto, certifique-se de executar o .exe como o mesmo usuário que executa seus servidores de SCP:SL (ou um com privilégios de administrador) + - Para instalar e obter plug-ins, confira a secção [Instalando plug-ins](https://github.com/ExMod-Team/EXILED/edit/master/.github/documentation/localization/README-BR.md#instala%C3%A7%C3%A3o-manual). ### Instalação manual - - Baixe o **`Exiled.tar.gz` [daqui](https://github.com/ExMod-Team/EXILED/releases)** - - Extraia seus conteúdos com [7Zip](https://www.7-zip.org/) ou [WinRar](https://www.win-rar.com/download.html?&L=6) - - Mova a pasta **``EXILED``** para **`%appdata%`** *Note: Esta pasta precisa ir ao diretório ``C:\Users\%NomeDoUsuário%\AppData\Roaming``, e ***NÃO*** ao ``C:\Users\%NomeDoUsuário%\AppData\Roaming\SCP Secret Laboratory``, e **DEVE** estar em (...)\AppData\Roaming, não (...)\AppData\!* + - Baixe o **`Exiled.tar.gz` [aqui](https://github.com/ExMod-Team/EXILED/releases)** + - Extraia o conteúdo com [7Zip](https://www.7-zip.org/) ou [WinRar](https://www.win-rar.com/download.html?&L=6) + > [!CAUTION] + > As pastas a seguir precisam estar em ``C:\Users\%NomeDoUsuário%\AppData\Roaming``, e ***NÃO*** ``C:\Users\%NomeDoUsuário%\AppData\Roaming\SCP Secret Laboratory``. + - Mova a pasta **``EXILED``** para **`%appdata%`** - Mova **``SCP Secret Laboratory``** para **`%appdata%`**. - - Windows 10 e 11: - Escreva `%appdata%` na Cortana / no ícone de pesquisa ou na barra do Windows Explorer - - Qualquer outra versão do Windows: + - **Windows 10 e 11**: + Escreva `%appdata%` na Cortana, no ícone de pesquisa ou na barra do Windows Explorer + - **Outras versões do Windows**: Pressione Win + R e digite `%appdata%` ### Instalando plug-ins -É isso, o EXILED agora deve estar instalado e ativo na próxima vez que você inicializar seu servidor. Observe que o EXILED sozinho não fará quase nada, portanto, certifique-se de obter novos plug-ins no **[nosso servidor do Discord](https://discord.gg/PyUkWTg)** +O EXILED agora deve estar instalado e ativo na próxima vez que você iniciar o seu servidor. Observe que o EXILED sozinho não fará quase nada, portanto, certifique-se de obter novos plug-ins em **[nosso servidor do Discord](https://discord.gg/PyUkWTg)!** - Para instalar um plug-in, basta: - - Baixar um plug-in da [página de lançamentos *deles*](https://i.imgur.com/u34wgPD.jpg) (**DEVE ser um `.dll`!**) - - Mova-o para: ``C:\Users\%NomeDoUsuário%\AppData\Roaming\EXILED\Plugins`` (mova-se para cá pressionando Win + R e, em seguida, escrevendo `%appdata%`) + - Baixar um plug-in da [página de lançamentos *deles*](https://i.imgur.com/u34wgPD.jpg) (**PRECISA ser um `.dll`!**) + - Mova-o para: ``C:\Users\%NomeDoUsuário%\AppData\Roaming\EXILED\Plugins`` # Linux -### Instalação automática ([mais informações](https://github.com/ExMod-Team/EXILED/blob/master/EXILED/Exiled.Installer/README.md)) +> [!IMPORTANT] +> Certifique-se de executar o instalador como o mesmo usuário (ou root) que executa seus servidores de SCP:SL. -**Nota:** Se você estiver instalando o EXILED em um servidor remoto, certifique-se de executar o instalador como o mesmo usuário que executa seus servidores de SCP:SL (ou root) - - - Baixe o **`Exiled.Installer-Linux` [daqui](https://github.com/ExMod-Team/EXILED/releases)** (clique em Assets -> baixe o Instalador) - - Instale-o digitando **`./Exiled.Installer-Linux --path /path/to/server`** ou mova-o diretamente para dentro da pasta do servidor, mova para ele com o terminal(`cd`) e digite: **`./Exiled.Installer-Linux`**. - - Se você quiser o último pré-lançamento, simplesmente adicione **`--pre-releases`**. Exemplo: **`./Exiled.Installer-Linux /home/scp/server --pre-releases`** - - Outro exemplo, se você colocou `Exiled.Installer-Linux` na pasta do seu servidor: **`/home/scp/server/Exiled.Installer-Linux --pre-releases`** - - Para instalar e obter plug-ins, confira a seção [Instalando plug-ins](#installing-plugins-1) abaixo. +### Instalação automática ([mais informações](https://github.com/ExMod-Team/EXILED/blob/master/EXILED/Exiled.Installer/README.md)) +> [!CAUTION] +> Não esqueça de usar o ``chmod`` para dar as permissões necessárias para o instalador e executar o servidor dedicado pelo menos uma vez! + - Baixe o **`Exiled.Installer-Linux` [aqui](https://github.com/ExMod-Team/EXILED/releases)** (clique em Assets -> baixe o Instalador) + - Mova-o diretamente para dentro da pasta do servidor e digite: **`./Exiled.Installer-Linux`** ou, passe diretamente o caminho usando o comando: **`./Exiled.Installer-Linux --path /path/to/server`** + - Para instalar e obter plug-ins, confira a secção [Instalando plug-ins](https://github.com/ExMod-Team/EXILED/edit/master/.github/documentation/localization/README-BR.md#instalando-plug-ins-1). ### Instalação manual - - **Tenha certeza** de que você está conectado ao usuário que executa os servidores de SCP. - - Baixe o **`Exiled.tar.gz` [daqui](https://github.com/ExMod-Team/EXILED/releases)** (SSH: clique com o botão direito do mouse para receber o link do `Exiled.tar.gz` e então digite: **`wget (link_para_baixar)`**) + - Baixe o **`Exiled.tar.gz` [aqui](https://github.com/ExMod-Team/EXILED/releases)** (SSH: clique com o botão direito do mouse para copiar o link do `Exiled.tar.gz` e então digite: **`wget (link_para_baixar)`**) - Para extraí-lo à sua pasta atual, digite **``tar -xzvf EXILED.tar.gz``** - - Mova a pasta **`EXILED`** para **``~/.config``**. *Nota: Esta pasta precisa ir ao diretório ``~/.config``, e ***NÃO*** ``~/.config/SCP Secret Laboratory``* (SSH: **`mv EXILED ~/.config/`**) - - Mova a pasta **`SCP Secret Laboratory`** para **``~/.config``**. *Nota: Esta pasta precisa ir ao diretório ``~/.config``, e ***NÃO*** ``~/.config/SCP Secret Laboratory``* (SSH: **`mv SCP Secret Laboratory ~/.config/`**) + +> [!CAUTION] +> As pastas precisam ir para o diretório ``~/.config``, e ***NÃO*** ``~/.config/SCP Secret Laboratory``* + + - Mova a pasta **`EXILED`** para **``~/.config``**. (SSH: **`mv EXILED ~/.config/`**) + - Mova a pasta **`SCP Secret Laboratory`** para **``~/.config``**. (SSH: **`mv "SCP Secret Laboratory" ~/.config/`**) ### Instalando plug-ins -É isso, o EXILED agora deve estar instalado e ativo na próxima vez que você inicializar seu servidor. Observe que o EXILED sozinho não fará quase nada, portanto, certifique-se de obter novos plug-ins no **[nosso servidor do Discord](https://discord.gg/PyUkWTg)** +O EXILED agora deve estar instalado e ativo na próxima vez que você inicializar seu servidor. Observe que o EXILED sozinho não fará quase nada, portanto, certifique-se de obter novos plug-ins em **[nosso servidor do Discord](https://discord.gg/PyUkWTg)!** - Para instalar um plug-in, basta: - Baixar um plug-in da [página de lançamento *deles*](https://i.imgur.com/u34wgPD.jpg) (**DEVE ser um `.dll`!**) - - Mova-o para: ``~/.config/EXILED/Plugins`` (se você utiliza SSH como root, então procure pela `.config` correta, que estará dentro de `/home/(Usuário do Servidor de SCP)`) + - Mova-o para: ``~/.config/EXILED/Plugins`` (se você utiliza SSH como root, procure pela `.config` correta, que estará dentro de `/home/(Usuário do Servidor de SCP)`) # Configuração O EXILED por si só oferece algumas opções de configuração. Todas elas são geradas automaticamente na inicialização do servidor e estão localizadas no arquivo ``~/.config/EXILED/Configs/(PortaDoServidorAqui)-config.yml`` (``%AppData%\EXILED\Configs\(PortaDoServidorAqui)-config.yml`` no Windows). -As configurações do plug-in ***NÃO*** estarão no arquivo ``config_gameplay.txt`` supracitado, em vez disso, as configurações do plug-in são definidas no arquivo ``~/.config/EXILED/Configs/(PortaDoServidor)-config.yml`` (``%AppData%\EXILED\(PortaDoServidor)-config.yml`` no Windows). -No entanto, alguns plug-ins podem obter suas configurações de outros locais por conta própria. Esta é simplesmente a localização padrão do EXILED para eles, portanto, consulte o criador do plug-in se houver problemas. +As configurações dos plug-ins ***NÃO*** estarão no arquivo ``config_gameplay.txt``! +Em vez disso, você encontrará no arquivo ``~/.config/EXILED/Configs/(porta_do_servidor)-config.yml`` (``%AppData%\EXILED\Configs\(porta_do_servidor)-config.yml`` no Windows). + +> [!NOTE] +> Em versões mais recentes do EXILED, as configs dos plug-ins foram movidas para pastas próprias: ``EXILED\Configs\(nome_do_plugin)``. Você pode mudar esse comportamento +> editando a configuração do Loader em: ``SCP Secret Laboratory\LabAPI\configs\global\Exiled.Loader`` (ou ``SCP Secret Laboratory\LabAPI\configs\(porta_do_servidor)\Exiled.Loader``) + +No entanto, alguns plug-ins podem gerar suas configurações em outros locais por conta própria. Este é simplesmente o local padrão do EXILED para esses arquivos, portanto, consulte o criador do plug-in se houver problemas. # Para Desenvolvedores -Se você deseja fazer um plug-in ao EXILED, é bem simples de fazê-lo. Se você quiser ver algum tipo de tutorial, visite nosso [Manual de Instruções.](GettingStarted-BR.md) +Se você deseja fazer um plug-in com o EXILED, é bem simples. Caso queira ver um tutorial, visite nosso [Manual de Instruções.](GettingStarted-BR.md) Para tutoriais mais abrangentes e ativamente atualizados, consulte [o site da EXILED](https://exmod-team.github.io/EXILED/). Mas certifique-se de seguir estas regras ao publicar seus plug-ins: - Seu plug-in deve conter uma classe herdada de ``Exiled.API.Features.Plugin<>``, caso contrário, o EXILED não carregará seu plug-in quando o servidor iniciar. - - Quando um plug-in é carregado, o código dentro do método ``OnEnabled()`` da classe supracitada é acionado imediatamente, ele não espera que outros plug-ins sejam carregados. Ele não espera a conclusão do processo de inicialização do servidor. ***Ele não espera por nada.*** Ao configurar seu método ``OnEnable()``, certifique-se de não estar acessando coisas que ainda não foram inicializadas pelo servidor, como ``ServerConsole.Port``, ou ``PlayerManager.localPlayer``. - - Se você precisar acessar coisas que não foram inicializadas antes do carregamento do plug-in, é recomendável simplesmente aguardar o evento ``WaitingForPlayers`` para fazê-lo, se por algum motivo precisar fazer as coisas antes, envolva o código em um loop ``` while(!x)``` que verifica se a variável/objeto que você precisa não é mais *null* antes de continuar. + - Quando um plug-in é carregado, o código dentro do método ``OnEnabled()`` da classe é chamado imediatamente (Dependendo do ``Exiled.API.Features.Plugin<>::PluginPriority``) + - Se você precisar acessar algo que ainda não foi inicializado antes do carregamento do plug-in, recomendamos simplesmente ouvir o evento ``WaitingForPlayers``. Se por algum motivo você precisar fazer isso antes, coloque o código dentro de um loop ```while (!x)``` onde verifica se a variável/objeto que você precisa não é mais *null* antes de continuar. - O EXILED suporta o recarregamento dinâmico de Assemblies de plug-ins no meio da execução. Isso significa que, se você precisar atualizar um plug-in, isso pode ser feito sem reiniciar o servidor, no entanto, se você estiver atualizando um plug-in no meio da execução, o plug-in precisa ser configurado corretamente para suportá-lo, ou você terá um sério problema. Consulte a seção ``Atualizações Dinâmicas`` para mais informações e orientações a seguir. - - **NÃO** há evento OnUpdate, OnFixedUpdate ou OnLateUpdate no EXILED. Se você precisar, por algum motivo, executar o código com frequência, poderá usar uma corrotina MEC que espera por um quadro, 0.01f, ou usar uma camada de Timing como Timing.FixedUpdate. + - **NÃO** há evento OnUpdate, OnFixedUpdate ou OnLateUpdate no EXILED. Se você precisar, por algum motivo, executar o código com frequência, poderá usar uma corrotina MEC que espera por um quadro, 0.01f, ou usar um segmento de Timing como ``Timing.FixedUpdate``. ### Desativando patches de evento do EXILED ***Atualmente, esta função não está mais implementada.*** -### Corrotinas MEC +### Corrotinas do MEC Se você não estiver familiarizado com o MEC, este será um guia muito breve e simples para você começar. -Corrotinas MEC são basicamente métodos cronometrados que suportam períodos de espera antes de continuar a execução, sem interromper/suspender o alinhamento (thread) principal do jogo. -As corrotinas MEC são seguras para usar com o Unity, ao contrário do alinhamento tradicional. ***NÃO tente criar novos alinhamentos para interagir com o Unity, eles VÃO travar o servidor.*** +As corrotinas do MEC são basicamente métodos temporizados que suportam períodos de espera antes de continuar a execução, sem interromper/suspender a thread principal do jogo. +Elas são seguras para usar com o Unity, ao contrário do threading tradicional. ***NÃO tente criar NOVAS THREADS para interagir com o Unity, isso irá travar o servidor!!!*** Para usar o MEC, você precisará referenciar ``Assembly-CSharp-firstpass.dll`` dos arquivos do servidor e incluir ``using MEC;``. -Exemplo de chamada de uma corrotina simples, que se repete com um atraso entre cada ciclo: +Exemplo de criação de uma corrotina simples, que se repete com um atraso a cada ciclo: ```cs using MEC; using Exiled.API.Features; @@ -116,24 +132,24 @@ public IEnumerator MyCoroutine() { for (;;) //Repete o evento seguinte por tempo indefinido { - Log.Info("Ei, eu sou um ciclo infinito!"); //Designar Log.Info para reproduzir uma linha nos registros do console/servidor do jogo. + Log.Info("Ei, eu sou um ciclo infinito!"); // Usado para reproduzir uma linha nos registros do console/servidor do jogo. yield return Timing.WaitForSeconds(5f); //Diz à corrotina para esperar 5 segundos antes de continuar, e quando está no final do ciclo, efetivamente interrompe a repetição do ciclo por 5 segundos. } } ``` -É **altamente** recomendável que você pesquise no Google ou pergunte no Discord se não estiver familiarizado com o MEC e quiser aprender mais, obter conselhos ou precisar de ajuda. As perguntas, não importa o quão 'estúpidas' sejam, sempre serão respondidas da maneira mais útil e clara possível para que os desenvolvedores de plug-ins se destaquem. Um bom código é melhor para todos. +É **altamente** recomendável que você pesquise no Google ou pergunte no Discord se não estiver familiarizado com o MEC e quiser aprender mais, obter conselhos ou precisar de ajuda. As perguntas, não importa o quão 'estúpidas' sejam, sempre serão respondidas da maneira mais útil e clara possível. Um bom código é melhor para todos. ### Atualizações Dinâmicas -O EXILED como uma estrutura suporta o recarregamento dinâmico de Assemblies de plug-ins sem exigir uma reinicialização do servidor. -Por exemplo, se você iniciar o servidor apenas com `Exiled.Events` como o único plug-in e desejar adicionar um novo, não será necessário reiniciar o servidor para concluir esta tarefa. Você pode simplesmente usar o comando do RemoteAdmin/ServerConsole `reload plugins` para recarregar todos os plug-ins do EXILED, incluindo os novos que não foram carregados antes. +O EXILED como uma estrutura suporta o recarregamento dinâmico de Assemblies de plug-ins sem precisar reiniciar o servidor. +Por exemplo, apenas com `Exiled.Events` como o único plug-in e depois você deseja adicionar um novo, não será necessário reiniciar o servidor. Você pode simplesmente usar o comando do RemoteAdmin/ServerConsole `reload plugins` para recarregar todos os plug-ins do EXILED, incluindo os novos que não foram carregados antes. Isso também significa que você pode *atualizar* os plug-ins sem precisar reinicializar totalmente o servidor. No entanto, existem algumas diretrizes que devem ser seguidas pelo desenvolvedor do plug-in para que isso seja realizado corretamente: ***Para Hosters*** - Se você estiver atualizando um plug-in, certifique-se de que o nome do Assembly não seja o mesmo da versão atual que você instalou (se houver uma). O plug-in deve ser construído pelo desenvolvedor com atualizações dinâmicas em mente para que isso funcione, simplesmente renomear o arquivo não basta. - Se o plug-in suporta Atualizações Dinâmicas, certifique-se de que, ao colocar a versão mais recente do plug-in na pasta "Plugins", você também remova a versão mais antiga da pasta, antes de recarregar o EXILED; a falha em garantir isso resultará em muitos problemas indesejados. - - Quaisquer problemas decorrentes da Atualização Dinâmica de um plug-in são de sua exclusiva responsabilidade e do desenvolvedor do plug-in em questão. Embora o EXILED suporte e incentive totalmente as Atualizações Dinâmicas, a única maneira de isso falhar ou dar errado é se o anfitrião do servidor ou o desenvolvedor do plug-in fizer algo errado. Verifique três vezes se tudo foi feito corretamente por ambas as partes antes de relatar um erro aos desenvolvedores da EXILED em relação às Atualizações Dinâmicas. + - Quaisquer problemas decorrentes da Atualização Dinâmica de um plug-in são de sua exclusiva responsabilidade e do desenvolvedor do plug-in em questão. Embora o EXILED suporte e incentive totalmente as Atualizações Dinâmicas, a única maneira de isso falhar ou dar errado é se o dono do servidor ou o desenvolvedor do plug-in fizer algo errado. Verifique três vezes se tudo foi feito corretamente por ambas as partes antes de relatar um erro aos desenvolvedores da EXILED em relação às Atualizações Dinâmicas. ***Para Desenvolvedores*** @@ -141,14 +157,14 @@ Isso também significa que você pode *atualizar* os plug-ins sem precisar reini - Os plug-ins que possuem patches personalizados do Harmony devem usar algum tipo de variável mutável no nome da instância do Harmony e devem usar UnPatchAll() em sua instância do Harmony quando o plug-in for desativado ou recarregado. - Quaisquer corrotinas iniciadas pelo plug-in em ``OnEnabled()`` também devem ser eliminadas quando o plug-in for desativado ou recarregado. -Tudo isso pode ser realizado nos métodos ``OnReloaded()`` ou ``OnDisabled()`` na classe do plug-in. Quando o EXILED recarrega os plug-ins, ele designa OnDisabled(), então ``OnReloaded()``, então ele carregará nos novos Assemblies, e então executará ``OnEnabled()``. +Tudo isso pode ser realizado nos métodos ``OnReloaded()`` ou ``OnDisabled()`` na classe do plug-in. Quando o EXILED recarrega os plug-ins, ele chama ``OnDisabled()``, então ``OnReloaded()``, então ele carregará nos novos Assemblies, e então executará ``OnEnabled()``. Observe que eu disse *novos* Assemblies. Se você substituir um Assembly por outro com o mesmo nome, ele ***NÃO*** será atualizado. Isso se deve ao GAC (Global Assembly Cache), se você tentar 'carregar' um Assembly que já está no cache, ele sempre usará o Assembly em cache. Por esse motivo, se o seu plug-in oferecer suporte a Atualizações Dinâmicas, você deverá criar cada versão com um nome de Assembly diferente nas opções de compilação (renomear o arquivo não funcionará). Além disso, como o Assembly antigo não é "destruído" quando não é mais necessário, se você não cancelar a assinatura de eventos, desfazer o patch de sua instância de Harmony, eliminar corrotinas, etc., esse código continuará a ser executado, bem como o código da nova versão. -Esta é uma péssima, bem péssima situação para se deixar ocorrer. +Esta é uma situação muito ruim para se deixar acontecer. -Como tal, os plug-ins que oferecem suporte a Atualizações Dinâmicas ***DEVEM*** seguir estas diretrizes ou serão removidos do servidor do Discord devido ao risco potencial para os anfitriões de servidor. +Como tal, os plug-ins que oferecem suporte a Atualizações Dinâmicas ***DEVEM*** seguir estas diretrizes ou serão removidos do servidor do Discord devido ao risco potencial para os donos de servidor. -Mas nem todo plug-in tem de oferecer suporte a Atualizações Dinâmicas. Se você não pretende oferecer suporte a Atualizações Dinâmicas, tudo bem, simplesmente não altere o nome do Assembly do seu plug-in ao criar uma nova versão e não precisará se preocupar com nada disso, apenas certifique-se de que os anfitriões de servidor saibam que eles precisarão reinicializar completamente seus servidores para atualizar seu plug-in. +Mas nem todo plug-in tem de oferecer suporte a Atualizações Dinâmicas. Se você não pretende oferecer suporte a Atualizações Dinâmicas, tudo bem, simplesmente não altere o nome do Assembly do seu plug-in ao criar uma nova versão e não precisará se preocupar com nada disso, apenas certifique-se de que os donos de servidor saibam que eles precisarão reinicializar completamente seus servidores para atualizar seu plug-in. -**Tradução brasileira feita por**: *Firething* +**Tradução para o português feita por**: *Unbistrackted* e *Firething*