From d8402c2040e6f57888e7b8a0d166fd80928eae4c Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 22:52:20 +0100 Subject: [PATCH 01/11] Update links to OnVehicleDamageStatusUpdate in EnableTirePopping documentation --- frontend/docs/scripting/functions/EnableTirePopping.md | 2 +- .../current/scripting/functions/EnableTirePopping.md | 2 +- .../current/scripting/functions/EnableTirePopping.md | 2 +- .../current/scripting/functions/EnableTirePopping.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/docs/scripting/functions/EnableTirePopping.md b/frontend/docs/scripting/functions/EnableTirePopping.md index 1f103d85c66..b0dcf62f6a0 100644 --- a/frontend/docs/scripting/functions/EnableTirePopping.md +++ b/frontend/docs/scripting/functions/EnableTirePopping.md @@ -34,7 +34,7 @@ public OnGameModeInit() - This function was removed in SA-MP 0.3. - Tire popping is enabled by default. -- If you want to disable tire popping, you'll have to manually script it using [OnVehicleDamageStatusUpdate](OnVehicleDamageStatusUpdate). +- If you want to disable tire popping, you'll have to manually script it using [OnVehicleDamageStatusUpdate](../callbacks/OnVehicleDamageStatusUpdate). ::: diff --git a/frontend/i18n/bs/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md b/frontend/i18n/bs/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md index c828d36a9c1..55907fdd6b7 100644 --- a/frontend/i18n/bs/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md +++ b/frontend/i18n/bs/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md @@ -32,7 +32,7 @@ public OnGameModeInit() :::warning -Ova je funkcija uklonjena u SA-MP 0.3. Pucanje guma je omogućeno prema zadanim postavkama. Ako želite onemogućiti pucanje guma, morat ćete ga ručno skriptati koristeći [OnVehicleDamageStatusUpdate](OnVehicleDamageStatusUpdate). +Ova je funkcija uklonjena u SA-MP 0.3. Pucanje guma je omogućeno prema zadanim postavkama. Ako želite onemogućiti pucanje guma, morat ćete ga ručno skriptati koristeći [OnVehicleDamageStatusUpdate](../callbacks/OnVehicleDamageStatusUpdate). ::: diff --git a/frontend/i18n/fa/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md b/frontend/i18n/fa/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md index ea95750b13c..a0b69949606 100644 --- a/frontend/i18n/fa/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md +++ b/frontend/i18n/fa/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md @@ -34,7 +34,7 @@ public OnGameModeInit() - این تابع در SA-MP 0.3 حذف شده است. - ترکیدن لاستیک به طور پیش‌فرض فعال است. -- اگر می‌خواهید ترکیدن لاستیک را غیرفعال کنید، باید آن را به صورت دستی با استفاده از [OnVehicleDamageStatusUpdate](OnVehicleDamageStatusUpdate) اسکریپت کنید. +- اگر می‌خواهید ترکیدن لاستیک را غیرفعال کنید، باید آن را به صورت دستی با استفاده از [OnVehicleDamageStatusUpdate](../callbacks/OnVehicleDamageStatusUpdate) اسکریپت کنید. ::: diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md index a8e80b7e708..c41d3dfd503 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md @@ -34,7 +34,7 @@ public OnGameModeInit() - Esta função foi removida em SA-MP 0.3. - O estouro de pneus está habilitado por padrão. -- Se quiser desativar o estouro de pneus, você terá que criar um script manualmente usando [OnVehicleDamageStatusUpdate](OnVehicleDamageStatusUpdate). +- Se quiser desativar o estouro de pneus, você terá que criar um script manualmente usando [OnVehicleDamageStatusUpdate](../callbacks/OnVehicleDamageStatusUpdate). ::: From 06cb43368a52eee976e98c058315769c1d93752e Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:00:44 +0100 Subject: [PATCH 02/11] Refactor WarningVersion component to use translation for version warning messages --- .../translations/pt-BR/version-warning.tsx | 12 ++++++-- .../components/templates/version-warning.tsx | 30 +++++++++++++++++-- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/frontend/src/components/templates/translations/pt-BR/version-warning.tsx b/frontend/src/components/templates/translations/pt-BR/version-warning.tsx index 4c9b1abfa15..923efff94f0 100644 --- a/frontend/src/components/templates/translations/pt-BR/version-warning.tsx +++ b/frontend/src/components/templates/translations/pt-BR/version-warning.tsx @@ -5,13 +5,19 @@ export default function WarningVersion({ name = "function", }: { version: string; - name: string; + name?: string; }) { + const item = + name === "function" ? "função" : name === "callback" ? "callback" : name; + const startsWithFeminine = item === "função"; + const article = startsWithFeminine ? "Esta" : "Este"; + const added = startsWithFeminine ? "adicionada" : "adicionado"; + return (

- Esta {name} foi implementada no {version} e não funcionará em versões - anteriores. + {article} {item} foi {added} no {version} e não funcionará em versões + anteriores!

); diff --git a/frontend/src/components/templates/version-warning.tsx b/frontend/src/components/templates/version-warning.tsx index b68ee9d5e70..ee0e64f78e6 100644 --- a/frontend/src/components/templates/version-warning.tsx +++ b/frontend/src/components/templates/version-warning.tsx @@ -1,17 +1,41 @@ import Admonition from "../Admonition"; +import Translate, { translate } from "@docusaurus/Translate"; export default function WarningVersion({ version, name = "function", }: { version: string; - name: string; + name?: string; }) { + const translatedName = + name === "function" + ? translate({ + id: "versionWarn.name.function", + message: "function", + description: "Default item name in a version warning", + }) + : name === "callback" + ? translate({ + id: "versionWarn.name.callback", + message: "callback", + description: "Callback item name in a version warning", + }) + : name; + return (

- This {name} was added in {version} and will not work in earlier - versions! + + {"This {name} was added in {version} and will not work in earlier versions!"} +

); From bcc8df9644c13b5b2b5846f72ce8296f62fe676f Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:00:51 +0100 Subject: [PATCH 03/11] Add version warning messages for new API features in pt-BR translation --- frontend/i18n/pt-BR/code.json | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/frontend/i18n/pt-BR/code.json b/frontend/i18n/pt-BR/code.json index b091557e0eb..435ebd5cf85 100644 --- a/frontend/i18n/pt-BR/code.json +++ b/frontend/i18n/pt-BR/code.json @@ -381,5 +381,17 @@ }, "navbar.item.Donate": { "message": "Doar" + }, + "versionWarn.name.function": { + "message": "função", + "description": "Default item name in a version warning" + }, + "versionWarn.name.callback": { + "message": "callback", + "description": "Callback item name in a version warning" + }, + "versionWarn.message": { + "message": "Esta {name} foi adicionada no {version} e não funcionará em versões anteriores!", + "description": "Warning shown on scripting docs pages for APIs added in a specific server version" } } From d526344e925d506c4a8a812829d0a3478867e394 Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:01:30 +0100 Subject: [PATCH 04/11] Update version warning messages in Portuguese documentation for various callbacks and functions --- .../current/scripting/callbacks/OnActorStreamIn.md | 2 +- .../current/scripting/callbacks/OnActorStreamOut.md | 2 +- .../current/scripting/callbacks/OnPickupStreamIn.md | 2 +- .../current/scripting/callbacks/OnPickupStreamOut.md | 2 +- .../current/scripting/callbacks/OnPlayerFinishedDownloading.md | 2 +- .../current/scripting/callbacks/OnPlayerGiveDamage.md | 2 +- .../current/scripting/callbacks/OnPlayerGiveDamageActor.md | 2 +- .../current/scripting/callbacks/OnPlayerRequestDownload.md | 2 +- .../current/scripting/callbacks/OnVehicleSirenStateChange.md | 2 +- .../current/scripting/callbacks/OnVehicleStreamIn.md | 2 +- .../current/scripting/functions/AddCharModel.md | 2 +- .../current/scripting/functions/AddSimpleModel.md | 2 +- .../current/scripting/functions/AddSimpleModelTimed.md | 2 +- .../current/scripting/functions/ApplyActorAnimation.md | 2 +- .../current/scripting/functions/DestroyActor.md | 2 +- .../current/scripting/functions/GetObjectModel.md | 2 +- .../current/scripting/functions/SetActorHealth.md | 2 +- .../current/scripting/functions/SetActorPos.md | 2 +- .../current/scripting/functions/SetVehicleParamsCarDoors.md | 2 +- .../current/scripting/functions/SetVehicleParamsCarWindows.md | 2 +- 20 files changed, 20 insertions(+), 20 deletions(-) diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md index c64ed7de5ba..821868ecc4b 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md @@ -5,7 +5,7 @@ description: Esta callback é chamada quando um ator é carregado (torna-se vis tags: [] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md index e918ac226f5..41de10d08d9 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md @@ -5,7 +5,7 @@ description: Esta callback é chamada quando um ator é descarregado (torna-se i tags: [] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamIn.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamIn.md index 44cfc3cb350..63907d66541 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamIn.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamIn.md @@ -5,7 +5,7 @@ description: Este callback é chamado quando um pickup entra no campo visual de tags: ["player"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamOut.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamOut.md index 8619d379c5f..5cfac45d880 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamOut.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPickupStreamOut.md @@ -5,7 +5,7 @@ description: Este callback é chamado quando um pickup sai do campo visual de um tags: ["player"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerFinishedDownloading.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerFinishedDownloading.md index 7c853ea403f..374abd620c9 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerFinishedDownloading.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerFinishedDownloading.md @@ -5,7 +5,7 @@ description: Esta callback é chamada quando um jogador termina de baixar os mod tags: ["player"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamage.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamage.md index 4a7e65d43cb..a8013a416a5 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamage.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamage.md @@ -5,7 +5,7 @@ description: Esta callback é chamada quando um jogador causa danos a algum joga tags: ["player"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamageActor.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamageActor.md index 89c830a676e..445f97b1bc6 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamageActor.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerGiveDamageActor.md @@ -5,7 +5,7 @@ description: Esta callback é chamada quando o jogador causa dano a um ator. tags: ["player"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestDownload.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestDownload.md index 3d8fd5b5e56..c17972d09e9 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestDownload.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestDownload.md @@ -5,7 +5,7 @@ description: Esta callback é chamada quando um jogador solicita o download de m tags: ["player"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleSirenStateChange.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleSirenStateChange.md index 4d2d4f5a671..7dd28c95319 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleSirenStateChange.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleSirenStateChange.md @@ -5,7 +5,7 @@ description: Essa callback é chamada quando a sirene de um carro é ligada/desl tags: ["vehicle"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md index 227f81985fa..f9dfb906ac0 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md @@ -5,7 +5,7 @@ description: Essa callback é chamada quando um veículo entra na área visível tags: ["vehicle"] --- - + ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddCharModel.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddCharModel.md index 53a103f8b8b..6e0ae70be12 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddCharModel.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddCharModel.md @@ -9,7 +9,7 @@ tags: [] :::warning -Esta função foi implementada no SA-MP 0.3.DL-R1 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.DL-R1 e não funcionará em versões anteriores! ::: diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModel.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModel.md index ccd80c62c83..07abd3556f2 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModel.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModel.md @@ -5,7 +5,7 @@ description: Adiciona um novo modelo de objeto simples personalizado para downlo tags: [] --- -Esta função foi implementada no SA-MP 0.3.DL-R1 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.DL-R1 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModelTimed.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModelTimed.md index 42ce510acff..f7d01c9aa67 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModelTimed.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/AddSimpleModelTimed.md @@ -5,7 +5,7 @@ description: Adiciona um novo modelo de objeto simples personalizado para downlo tags: [] --- -Esta função foi implementada no SA-MP 0.3.DL-R1 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.DL-R1 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/ApplyActorAnimation.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/ApplyActorAnimation.md index 9dbca5a5638..f6429db0bdd 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/ApplyActorAnimation.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/ApplyActorAnimation.md @@ -5,7 +5,7 @@ description: Aplica uma animação a um ator. tags: [] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/DestroyActor.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/DestroyActor.md index 00acb59fea1..53651aceacd 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/DestroyActor.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/DestroyActor.md @@ -5,7 +5,7 @@ description: Destrói um ator que foi criado com CreateActor. tags: [] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetObjectModel.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetObjectModel.md index 33f457bc79c..508c503d687 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetObjectModel.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetObjectModel.md @@ -5,7 +5,7 @@ description: Obtém o ID do modelo de um objeto (CreateObject). tags: [] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorHealth.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorHealth.md index 5899528911d..1e9c749372b 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorHealth.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorHealth.md @@ -5,7 +5,7 @@ description: Define a vida de um ator. tags: [] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorPos.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorPos.md index 8322d1324f8..17f1fc8cbc5 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorPos.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetActorPos.md @@ -5,7 +5,7 @@ description: Define a posição de um ator. tags: [] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarDoors.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarDoors.md index 635a4d84c0c..4078f6fd78f 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarDoors.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarDoors.md @@ -5,7 +5,7 @@ description: Permite abrir e fechar as portas de um veículo. tags: ["vehicle"] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarWindows.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarWindows.md index 0a72939ba86..a95050b5377 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarWindows.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/SetVehicleParamsCarWindows.md @@ -5,7 +5,7 @@ description: Permite abrir e fechar as janelas de um veículo. tags: ["vehicle"] --- -Esta função foi implementada no SA-MP 0.3.7 e não funcionará em versões anteriores. +Esta função foi adicionada no SA-MP 0.3.7 e não funcionará em versões anteriores! ## Descrição From e374832f9c893cc0a034bd94a519acbfcffa63be Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:07:23 +0100 Subject: [PATCH 05/11] Add UID generator translations and update component to use localized strings --- frontend/i18n/pt-BR/code.json | 28 +++++++++++++++ frontend/src/pages/uid.tsx | 68 +++++++++++++++++++++++++++-------- 2 files changed, 82 insertions(+), 14 deletions(-) diff --git a/frontend/i18n/pt-BR/code.json b/frontend/i18n/pt-BR/code.json index 435ebd5cf85..d8ac6626a47 100644 --- a/frontend/i18n/pt-BR/code.json +++ b/frontend/i18n/pt-BR/code.json @@ -393,5 +393,33 @@ "versionWarn.message": { "message": "Esta {name} foi adicionada no {version} e não funcionará em versões anteriores!", "description": "Warning shown on scripting docs pages for APIs added in a specific server version" + }, + "uid.page.title": { + "message": "Gerador de UID", + "description": "UID generator page title" + }, + "uid.page.description": { + "message": "Gere UIDs para usar como identificadores únicos de IComponent ou IExtension", + "description": "UID generator page description" + }, + "uid.heading": { + "message": "Gerador de UID de componente", + "description": "UID generator page heading" + }, + "uid.instructions.intro": { + "message": "Copie a macro {provideUid} abaixo para seu novo componente, no lugar da macro padrão de provedor de UID. Cada componente deve ter um UID único, por isso o {uniqueLetter} em {uidInitials} ({uniqueIdentifier}). O {provideUid} padrão é inválido e não compilará, para evitar duplicatas ao criar novos componentes a partir de templates.", + "description": "UID generator instructions explaining how to use the generated macro" + }, + "uid.instructions.findPlaceholder": { + "message": "Encontre este placeholder:", + "description": "UID generator instruction before the placeholder macro" + }, + "uid.instructions.replaceWith": { + "message": "E substitua por:", + "description": "UID generator instruction before the generated replacement macro" + }, + "uid.instructions.existingComponent": { + "message": "Se você estiver modificando um componente existente, lembre-se também de substituir o UID existente, que será um valor válido, não um placeholder.", + "description": "UID generator note for modifying an existing component" } } diff --git a/frontend/src/pages/uid.tsx b/frontend/src/pages/uid.tsx index d50d9f0cd07..8192902ffdf 100644 --- a/frontend/src/pages/uid.tsx +++ b/frontend/src/pages/uid.tsx @@ -1,3 +1,4 @@ +import { default as Translate, translate } from "@docusaurus/Translate"; import Layout from "@theme/Layout"; import { ReactNode, useEffect, useState } from "react"; import { ToastContainer } from "../components/Toast"; @@ -24,28 +25,67 @@ const Page = (): ReactNode => { return (
-

Component UID Generator

- Copy the PROVIDE_UID macro below in to your new - component, in place of the default UID provider macro. Each component - should have a unique UID, hence the U in UID ( - Unique IDentifier). The default PROVIDE_UID is - invalid and will not compile, to avoid duplicates when creating new - components from templates. +

+ + Component UID Generator + +

+ PROVIDE_UID, + uniqueLetter: U, + uidInitials: UID, + uniqueIdentifier: Unique IDentifier, + }} + > + { + "Copy the {provideUid} macro below in to your new component, in place of the default UID provider macro. Each component should have a unique UID, hence the {uniqueLetter} in {uidInitials} ({uniqueIdentifier}). The default {provideUid} is invalid and will not compile, to avoid duplicates when creating new components from templates." + } +

- Find this placeholder: + + Find this placeholder: +
PROVIDE_UID(/* UID GOES HERE */);

- And replace it with: + + And replace it with: +
{`PROVIDE_UID(${uid});`}

- If you are modifying an existing component still do remember to - replace the existing UID, which will be a valid value not a - placeholder. + + If you are modifying an existing component still do remember to + replace the existing UID, which will be a valid value not a + placeholder. +
From f7b18ecaba282b0ba82ada2e08ff9ecf7c5e8a77 Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:46:43 +0100 Subject: [PATCH 06/11] Add new Portuguese translations for server management and social media links --- frontend/i18n/pt-BR/code.json | 172 ++++++++++++++++++++++++++++++++++ 1 file changed, 172 insertions(+) diff --git a/frontend/i18n/pt-BR/code.json b/frontend/i18n/pt-BR/code.json index d8ac6626a47..f5a5a26880f 100644 --- a/frontend/i18n/pt-BR/code.json +++ b/frontend/i18n/pt-BR/code.json @@ -421,5 +421,177 @@ "uid.instructions.existingComponent": { "message": "Se você estiver modificando um componente existente, lembre-se também de substituir o UID existente, que será um valor válido, não um placeholder.", "description": "UID generator note for modifying an existing component" + }, + "lowercaseNote.name.function": { + "message": "função", + "description": "Default item name in a lowercase-name warning" + }, + "lowercaseNote.message": { + "message": "Esta {name} começa com uma letra minúscula.", + "description": "Warning shown on scripting docs pages for APIs whose names start with lowercase letters" + }, + "npcCallbacksTip.message": { + "message": "Esta callback também pode ser chamada por NPC.", + "description": "Tip shown on callback docs pages when NPCs can also call the callback" + }, + "toast.close": { + "message": "Fechar notificação", + "description": "Accessible label for closing a toast notification" + }, + "servers.add.successMessage": { + "message": "{serverName} foi adicionado à nossa lista pendente. Se ele não estiver disponível após no máximo 48 horas, você pode entrar em contato conosco no Discord!", + "description": "Toast message shown after submitting a server to the pending list" + }, + "servers.add.successTitle": { + "message": "Servidor enviado!", + "description": "Toast title shown after a server submission succeeds" + }, + "servers.add.failureMessage": { + "message": "Status {status}: {error}", + "description": "Toast message shown after a server submission fails" + }, + "servers.add.failureTitle": { + "message": "Falha no envio!", + "description": "Toast title shown after a server submission fails" + }, + "servers.add.errorMessage": { + "message": "Ocorreu um erro ao enviar o servidor", + "description": "Toast message shown after an unexpected server submission error" + }, + "servers.add.errorTitle": { + "message": "Erro", + "description": "Generic toast error title" + }, + "servers.add.addressPlaceholder": { + "message": "IP/Domínio", + "description": "Add server address input placeholder" + }, + "servers.add.submit": { + "message": "Adicionar", + "description": "Add server submit button" + }, + "servers.add.openModal": { + "message": "Adicionar servidor", + "description": "Button that opens the add server modal" + }, + "servers.filter.showEmpty": { + "message": "Mostrar servidores vazios", + "description": "Checkbox label to show empty servers" + }, + "servers.filter.showOmpOnly": { + "message": "Mostrar apenas servidores open.mp", + "description": "Checkbox label to show only open.mp servers" + }, + "servers.filter.showPartnersOnly": { + "message": "Mostrar apenas parceiros", + "description": "Checkbox label to show only partner servers" + }, + "servers.add.modalTitle": { + "message": "Adicionar um servidor", + "description": "Add server modal title" + }, + "servers.add.closeModal": { + "message": "Fechar modal de adicionar servidor", + "description": "Accessible label for closing the add server modal" + }, + "servers.add.addressLabel": { + "message": "IP ou domínio", + "description": "Add server address field label" + }, + "servers.add.addressHelp": { + "message": "O IP deve estar no formato {format}", + "description": "Help text explaining the required server address format" + }, + "servers.add.close": { + "message": "Fechar", + "description": "Close modal button" + }, + "servers.page.title": { + "message": "Servidores", + "description": "Servers page title" + }, + "servers.page.description": { + "message": "Lista de servidores San Andreas usando open.mp e SA-MP", + "description": "Servers page description" + }, + "partners.page.title": { + "message": "Servidores parceiros", + "description": "Partner servers page title" + }, + "partners.page.description": { + "message": "Lista de servidores San Andreas usando open.mp ou SA-MP", + "description": "Partner servers page description" + }, + "downloads.launcher.layoutDescription": { + "message": "Baixe releases do launcher open.mp", + "description": "Launcher downloads page meta description" + }, + "downloads.server.layoutDescription": { + "message": "Baixe releases do servidor open.mp", + "description": "Server downloads page meta description" + }, + "downloads.release.githubTitle": { + "message": "Ver release no GitHub", + "description": "Title attribute for the GitHub release link" + }, + "animations.layoutTitle": { + "message": "Animações", + "description": "Animations page browser title" + }, + "animations.layoutDescription": { + "message": "Visualizador interativo de animações do open.mp (SA-MP) com prévias em vídeo", + "description": "Animations page meta description" + }, + "animations.videoUnavailable": { + "message": "Vídeo indisponível", + "description": "Fallback message when an animation video fails to load" + }, + "animations.code.forPlayers": { + "message": "// Para jogadores", + "description": "Comment in animation usage example for player animations" + }, + "animations.code.forActors": { + "message": "// Para atores", + "description": "Comment in animation usage example for actor animations" + }, + "homepage.social.discord": { + "message": "Ícone do Discord", + "description": "Accessible label and image alt text for homepage social link" + }, + "homepage.social.facebook": { + "message": "Ícone do Facebook", + "description": "Accessible label and image alt text for homepage social link" + }, + "homepage.social.instagram": { + "message": "Ícone do Instagram", + "description": "Accessible label and image alt text for homepage social link" + }, + "homepage.social.twitch": { + "message": "Ícone da Twitch", + "description": "Accessible label and image alt text for homepage social link" + }, + "homepage.social.x": { + "message": "Ícone do X (antigo Twitter)", + "description": "Accessible label and image alt text for homepage social link" + }, + "homepage.social.youtube": { + "message": "Ícone do YouTube", + "description": "Accessible label and image alt text for homepage social link" + }, + "announcement.dismissAria": { + "message": "Dispensar anúncio", + "description": "Accessible label for dismissing the homepage announcement" + }, + "homepage.downloadLauncherTitle": { + "message": "Baixar o launcher open.mp", + "description": "Title attribute for the launcher download button" + }, + "homepage.downloadServerTitle": { + "message": "open.mp foi lançado!", + "description": "Title attribute for the server download button" + }, + "homepage.layoutDescription": { + "message": "Um mod multiplayer para Grand Theft Auto: San Andreas totalmente retrocompatível com San Andreas Multiplayer", + "description": "Homepage meta description" } } From d9ff7ea7e9925567d8c491c684e9661d4f98c123 Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:46:58 +0100 Subject: [PATCH 07/11] Update authors list in launcher false positive documentation --- frontend/blog/2025-02-12-launcher-false-positive.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/blog/2025-02-12-launcher-false-positive.md b/frontend/blog/2025-02-12-launcher-false-positive.md index fbe0b033e81..b74a2ae4684 100644 --- a/frontend/blog/2025-02-12-launcher-false-positive.md +++ b/frontend/blog/2025-02-12-launcher-false-positive.md @@ -1,7 +1,7 @@ --- slug: launcher-false-positive title: Windows Defender False Positive on Launcher -authors: itsneufox +authors: [iamir, itsneufox] --- Some users have reported that **Windows Defender is flagging the open.mp Launcher as a Trojan/virus**. This is a **false positive**, the launcher is completely safe to use. From 223ce6296f43da39df904815ae4dda84d7db523b Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:47:38 +0100 Subject: [PATCH 08/11] add multiple blog posts in Portuguese --- .../2019-05-22-timers.md | 56 + ...9-10-19-turfs-formerly-gangzones-module.md | 43 + .../2020-04-06-debugging.md | 149 ++ .../2020-04-14-scripting-api.md | 457 ++++++ .../2020-11-23-interview.md | 1369 +++++++++++++++++ .../2021-07-16-10k-members.md | 41 + .../2021-08-29-how-to-join-the-team.md | 36 + .../2022-09-08-server-beta-9.md | 70 + .../2023-01-05-release-candidate-1.md | 151 ++ .../2024-03-06-porting.md | 170 ++ .../2025-02-12-launcher-false-positive.md | 37 + 11 files changed, 2579 insertions(+) create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-05-22-timers.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-10-19-turfs-formerly-gangzones-module.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-06-debugging.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-14-scripting-api.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-11-23-interview.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-07-16-10k-members.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-08-29-how-to-join-the-team.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2022-09-08-server-beta-9.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2023-01-05-release-candidate-1.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2024-03-06-porting.md create mode 100644 frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-05-22-timers.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-05-22-timers.md new file mode 100644 index 00000000000..ab28870aa56 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-05-22-timers.md @@ -0,0 +1,56 @@ +--- +slug: timers +title: Módulo de timers +authors: y_less +--- + +Esta prévia mostra melhorias no módulo de timers no open.mp, introduzindo uma API mais flexível e eficiente, mantendo a compatibilidade retroativa. + + + +:::warning + +O conteúdo da publicação abaixo está desatualizado e não reflete o estado atual do open.mp. A publicação está disponível aqui para fins de arquivamento. + +::: + +Esta é uma prévia de um dos módulos melhorados que fizemos, para timers no open.mp: + +```c +native SetTimer(const func[], msInterval, bool:repeat) = SetTimerEx; +native SetTimerEx(const func[], msInterval, bool:repeat, const params[], GLOBAL_TAG_TYPES:...); +native KillTimer(timer) = Timer_Kill; + +// CreateTimer +native Timer:Timer_Create(const func[], usDelay, usInterval, repeatCount, const params[] = "", GLOBAL_TAG_TYPES:...); + +// KillTimer +native bool:Timer_Kill(Timer:timer); + +// Retorna o tempo até a próxima chamada. +native Timer_GetTimeRemaining(Timer:timer); + +// Obtém o número de chamadas restantes a fazer (0 para ilimitado). +native Timer_GetCallsRemaining(Timer:timer); + +// Obtém o parâmetro `repeatCount`. +native Timer_GetTotalCalls(Timer:timer); + +// Obtém o parâmetro `usInterval`. +native Timer_GetInterval(Timer:timer); + +// Redefine o tempo restante até a próxima chamada para `usInterval`. +native bool:Timer_Restart(Timer:timer); +``` + +Os dois primeiros existem apenas para compatibilidade retroativa; o restante é a API melhorada: + +```c +native Timer:Timer_Create(const func[], usDelay, usInterval, repeatCount, const params[] = "", GLOBAL_TAG_TYPES:...); +``` + +- `func` - Bem óbvio: o que chamar. +- `usDelay` - Também óbvio: o atraso antes da chamada (em microssegundos). +- `usInterval` - Para qual valor redefinir `usDelay` depois da primeira chamada. Então, se você quisesse um timer a cada hora cheia, mas agora fossem 8:47 da manhã, a chamada seria `Timer_Create("OnTheHour", 780 SECONDS, 3600 SECONDS, 0);` +- `repeatCount` - Diferente das funções antigas, que eram apenas "uma vez" ou "para sempre", isto recebe o número de vezes que a função deve ser chamada. "Uma vez" seria `1`, `500` pararia após 500 chamadas e (ao contrário da API antiga) `0` significa "para sempre". +- `GLOBAL_TAG_TYPES` - Como `{Float, ...}`, mas com mais tags. diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-10-19-turfs-formerly-gangzones-module.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-10-19-turfs-formerly-gangzones-module.md new file mode 100644 index 00000000000..c66faab752b --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2019-10-19-turfs-formerly-gangzones-module.md @@ -0,0 +1,43 @@ +--- +slug: turfs-formerly-gangzones-module +title: Módulo de Turfs (anteriormente gangzones) +authors: j0sh +--- + +Olá! Acabei de terminar nossa implementação de Turf no servidor e pensei em publicar uma visão geral deste módulo e mostrar que não desistimos nem nada do tipo! + + + +:::warning + +O conteúdo da publicação abaixo está desatualizado e não reflete o estado atual do open.mp. A publicação está disponível aqui para fins de arquivamento. + +::: + +```c +// Cria um Turf. Um playerid pode ser passado para torná-lo um turf de jogador. +native Turf:Turf_Create(Float:minx, Float:miny, Float:maxx, Float:maxy, Player:owner = INVALID_PLAYER_ID); + +// Destrói um turf. +native Turf_Destroy(Turf:turf); + +// Mostra um Turf para um jogador ou jogadores. +// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID. +native Turf_Show(Turf:turf, colour, Player:playerid = INVALID_PLAYER_ID); + +// Oculta um Turf de um jogador ou jogadores. +// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID. +native Turf_Hide(Turf:turf, Player:playerid = INVALID_PLAYER_ID); + +// Faz um Turf piscar para um jogador ou jogadores. +// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID. +native Turf_Flash(Turf:turf, colour, Player:playerid = INVALID_PLAYER_ID); + +// Para o piscar de um Turf para jogador(es). +// Será enviado para todos os jogadores se playerid = INVALID_PLAYER_ID. +native Turf_StopFlashing(Turf:turf, Player:playerid = INVALID_PLAYER_ID); +``` + +Isso é obviamente diferente da API tradicional, mas não se preocupe: haverá wrappers para esse tipo de coisa, garantindo que um script normal possa ser recompilado sem problemas e sem edições. + +Outro fato importante que talvez você queira saber é que todos os turfs ficam no mesmo pool, e há um máximo de 4.294.967.295 turfs que podem ser criados pelo script. No entanto, o cliente só consegue lidar com 1024 turfs ao mesmo tempo. diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-06-debugging.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-06-debugging.md new file mode 100644 index 00000000000..2a1354228b4 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-06-debugging.md @@ -0,0 +1,149 @@ +--- +slug: debugging +title: Testes no open.mp +authors: y_less +--- + +Testar no SA:MP sempre foi desafiador, mas o open.mp introduz novas ferramentas para tornar isso mais fácil e eficiente. Com uma base de código open-source, ferramentas de depuração aprimoradas e uma nova e poderosa biblioteca de "mock" para simular interações de jogadores, os testes agora são mais automatizados e confiáveis do que nunca. + + + +:::warning + +O conteúdo do post a seguir está desatualizado e não reflete o estado atual do open.mp. O post está publicado aqui para fins de arquivamento. + +::: + +Testar no SA:MP não é muito fácil. Na maior parte do tempo é só conectar ao servidor e colocar prints em todos os lugares. Bibliotecas como y_testing tornam a escrita de testes unitários muito mais fácil, mas apenas para código razoavelmente "puro" - isto é, código que roda no servidor sem muita interação de jogadores. Dá para testar uma quantidade surpreendente de comportamento assim, mas ainda é limitado e não ajuda a isolar problemas quando eles aparecem. + +Então como o open.mp resolve isso? Bem, para começar, o código é open-source, então você tem à disposição toda a variedade de ferramentas de depuração existentes, como GDB e Visual Studio, para percorrer e inspecionar o código. Também temos planos de adicionar ferramentas parecidas para os próprios scripts pawn. + +Mas a maior adição é a biblioteca "mock". De forma bem simples, ela permite criar jogadores falsos que agem exatamente como jogadores reais, mas sem nenhum cliente conectado. Assim, qualquer ação feita neles por um script pode ser lida e analisada por outro script. Vamos pegar o exemplo mais simples possível para uma primeira demonstração - mostrar um checkpoint a um jogador e confirmar que ele foi enviado. Com y_testing você faz a ação e depois precisa realmente perguntar ao jogador se aconteceu, o que é lento, não repetível e simplesmente tedioso: + +```c +PTEST__ SetPlayerCheckpoint(playerid) +{ + SetPlayerCheckpoint(playerid, 0.0, 0.0, 4.0, 5.0); + ASK("Do you see a checkpoint in the middle of the world?"); +} +``` + +Usar uma biblioteca como "Pawn.RakNet" pode remover a pergunta, automatizando a verificação de pacotes enviados, mas ainda exige um jogador conectado, então não pode ser automatizado e repetido: + +```c +static + gCheckpointPlayer, + Float:gX, + Float:gY, + Float:gZ, + Float:gS; + +PTEST__ SetPlayerCheckpoint(playerid) +{ + SetPlayerCheckpoint(playerid, 0.0, 0.0, 4.0, 5.0); + ASSERT(gX == 0.0); + ASSERT(gY == 0.0); + ASSERT(gZ == 4.0); + ASSERT(gS == 5.0); + ASSERT(gCheckpointPlayer == playerid); +} + +OPacket:107(playerid, BitStream:bs) +{ + gCheckpointPlayer = playerid; + + BS_IgnoreBits(bs, 8); + BS_ReadFloat(bs, gX); + BS_ReadFloat(bs, gY); + BS_ReadFloat(bs, gZ); + BS_ReadFloat(bs, gS); + + return 1; +} +``` + +Com o open.mp, temos uma API parecida com a do Pawn.RakNet, mas com jogadores falsos. Então você cria um jogador, sem uma instância do jogo, e o usa exatamente como um jogador normal: + +```c +TEST__ SetPlayerCheckpoint() +{ + new playerid = Mock_CreatePlayer("Mr Mock"); + + // Limpa todos os pacotes existentes para facilitar a busca. + Mock_PurgeSent(playerid); + + // Mostra um checkpoint normalmente. + SetPlayerCheckpoint(playerid, 0.0, 0.0, 4.0, 5.0); + + // Verifica se um pacote "SetCheckpoint" foi visto. + new MockPacket:packet = Mock_GetPacket(playerid, "SetCheckpoint"); + ASSERT(packet); + if (!packet) return; + + // Verifica se o pacote tem 4 componentes, cada um com 32 bits. + ASSERT(MockPacket_Components(packet) == 4); + ASSERT(MockPacket_Bits(packet) == 4 * 32); + + // Verifica os vários componentes. + new Float:tmp; + ASSERT(MockPacket_ReadFloat(packet, 0, tmp)); + ASSERT(tmp == 0.0); + ASSERT(MockPacket_ReadFloat(packet, 1, tmp)); + ASSERT(tmp == 0.0); + ASSERT(MockPacket_ReadFloat(packet, 2, tmp)); + ASSERT(tmp == 4.0); + ASSERT(MockPacket_ReadFloat(packet, 3, tmp)); + ASSERT(tmp == 5.0); +} +``` + +Esse código é totalmente testável de forma repetível, autocontido (sem variáveis globais e callbacks extras) e simples de expandir. + +Mas às vezes não é tão simples assim. Se você cria um objeto, não pode simplesmente verificar que ele foi enviado instantaneamente a um jogador, porque talvez ele não esteja perto o bastante e, portanto, o streamer embutido ainda não o enviou. Para resolver isso, primeiro precisamos fazer um pequeno desvio para explicar como a sincronização básica funciona para coisas como `SetPlayerPos`. Quando você define a posição de um jogador com `SetPlayerPos`, o servidor NÃO atualiza imediatamente a posição dele internamente e para todos os outros jogadores. Em vez disso, um comando `SET POSITION` é enviado para aquele jogador que está sendo movido, ele é teleportado para a nova posição e então informa a nova posição de volta ao servidor no próximo pacote de sincronização. O motivo é basicamente lag - pode haver um ou mais pacotes de sincronização ainda em trânsito com a posição antiga depois de definir a nova posição. Então o que isso significa para jogadores mock? Significa que você não pode realmente definir a posição deles, pelo menos não da forma normal. Não há cliente real, então não há nada recebendo pacotes (ou seja, o comando de definir posição), e não há nada sincronizando esses dados de volta para o servidor. + +Podemos gerar qualquer dado de sincronização mock para o servidor a partir de jogadores mock, então essa é uma forma de atualizar a posição deles, mas pode ser um pouco trabalhoso para apenas uma operação comum; por isso existe `Mock_SetPlayerPos` exatamente para esse caso de uso. Mas isso ainda não é a história completa, porque precisamos que o streamer rode e atualize com a nova posição deles, o que acontece apenas periodicamente (a cada poucos milissegundos, dependendo da taxa de ticks do servidor). Para isso temos outra função mock - `Mock_Tick`, que avança o tempo do servidor em um determinado número de microssegundos (NÃO milissegundos). Isso absolutamente não deve ser usado em servidores ao vivo, pois pode criar todo tipo de comportamento estranho com timers e outros códigos sensíveis ao tempo, mas pode ser usado para simular a passagem do tempo em testes. Observe que `Mock_Tick(10000)` não vai aguardar 10ms; em vez disso, vai avançar o tempo em 10 milissegundos instantaneamente. + +```c +TEST__ SetPlayerCheckpoint() +{ + new playerid = Mock_CreatePlayer("Mr Mock"); + + // Limpa todos os pacotes existentes para facilitar a busca. + Mock_PurgeSent(playerid); + + // Cria um objeto. + CreateObject(1337, 100.0, 100.0, 4.0); + + // Simula a atualização da posição do jogador mock para o servidor, perto do objeto. + Mock_SetPlayerPos(playerid, 105.0, 105.0, 4.0); + + // Agora SIMULA a passagem de algum tempo, para que o streamer possa rodar (50ms deve bastar). + Mock_Tick(50000); + + // Verifica se um pacote "CreateObject" foi visto. + new MockPacket:packet = Mock_GetPacket(playerid, "CreateObject"); + ASSERT(packet); + if (!packet) return; + + // Verifica se o pacote tem 4 componentes, cada um com 32 bits. + ASSERT(MockPacket_Components(packet) > 5); + + // Verifica alguns dos componentes do pacote. + new int; + new Float:tmp; + ASSERT(MockPacket_ReadInt32(packet, 1, int)); + ASSERT(int == 1337); + ASSERT(MockPacket_ReadFloat(packet, 2, tmp)); + ASSERT(tmp == 100.0); + ASSERT(MockPacket_ReadFloat(packet, 3, tmp)); + ASSERT(tmp == 100.0); + ASSERT(MockPacket_ReadFloat(packet, 4, tmp)); + ASSERT(tmp == 4.0); +} +``` + +Uma observação importante sobre `Mock_Tick`. Se você chamá-lo como, digamos, `Mock_Tick(100000)` e tiver um timer de 1ms rodando, isso acionará instantaneamente o timer, mas o timer pensará que perdeu seu tempo por uma grande margem (100ms) e se enfileirará novamente. Durante a chamada a `Mock_Tick`, o timer será disparado uma vez, mas depois que o teste atual terminar o timer será enfileirado mais 99 vezes, uma por tick, porque ele acha que perdeu 100 invocações. + +Mais tarde abordaremos algumas técnicas de depuração de nível mais alto para que você possa ler e escrever pacotes falsos com mais facilidade, em vez de um componente por vez como nesse código, mas isso apresenta o básico sobre o qual todo o resto é construído. Esperamos que isso torne o desenvolvimento e os testes de código mais fáceis para todos (e também garanta que o servidor seja mais estável). + +Também vamos falar muito mais sobre o design da API do open.mp amanhã. Ela é totalmente compatível com versões anteriores do SA:MP, mas isso não significa que não haja espaço paralelo para melhorias. diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-14-scripting-api.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-14-scripting-api.md new file mode 100644 index 00000000000..7669f8166c6 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-04-14-scripting-api.md @@ -0,0 +1,457 @@ +--- +slug: scripting-api +title: Design da API do open.mp +authors: y_less +--- + +Um foco principal do open.mp é manter a **compatibilidade retroativa** — seus scripts SA:MP existentes continuarão funcionando como estão. No entanto, o open.mp também introduz melhorias para corrigir inconsistências e tornar a criação de scripts mais intuitiva e poderosa. + +Veja alguns problemas comuns do SA:MP que estamos abordando e como o open.mp melhora a experiência. + + + +:::warning + +O conteúdo do post a seguir está desatualizado e não tem relação com o estado atual do open.mp. O post está publicado aqui para fins de arquivo. + +::: + +## Introdução + +Primeiro, um esclarecimento MUITO importante: scripts existentes ainda funcionarão como estão. Trabalhamos muito duro na compatibilidade retroativa e a levamos em consideração em todas as decisões. Há muitas melhorias que gostaríamos de fazer, mas simplesmente não podemos por esse motivo, além de outros códigos que ficam muito mais complicados por causa desse requisito de compatibilidade. + +Dito isso, há melhorias que podem ser feitas em todos os lugares. Vamos ver alguns exemplos de inconsistências nos scripts SA:MP: + +### Tags + +- `Menu:CreateMenu` - Com tag. +- `DB:db_open` - Com tag. +- `CreateVehicle` - Sem tag. +- `CreateActor` - Sem tag. + +```c +#define SELECT_OBJECT_GLOBAL_OBJECT 1 +#define SELECT_OBJECT_PLAYER_OBJECT 2 + +forward OnPlayerSelectObject(playerid, type, objectid, modelid, Float:fX, Float:fY, Float:fZ); +``` + +`type` não tem tag, assim como TODAS as constantes definidas pelo SA:MP; diferente das constantes padrão do pawn: + +```c +native File:fopen(const name[], filemode:mode = io_readwrite); +``` + +### Nomeação + +- `SetVehiclePos` - "Vehicle" no meio do nome da função. +- `TextDrawTextSize` - "TextDraw" no começo. +- `db_open` - "db" no começo e em minúsculas. +- `fread` - "file" no começo, e abreviado. +- `asin` - Uma função adicionada pelo SA:MP sem camel/pascal case. + +Consistência: + +- GetVehicleZAngle - "Z-Angle" +- GetVehicleRotationQuat - "Rotation" +- SetPlayerFacingAngle - "Facing Angle" +- SetObjectRot - "Rot" + +E apesar de tudo isso, a maioria das bibliotecas agora adotou a convenção de nomenclatura `Module_Method`. + +### Constantes + +- `65535` + +Valor para jogadores, atores, TDs e algumas outras coisas inválidas. Também é o valor para veículos inválidos, mas `0` TAMBÉM é um ID de veículo inválido às vezes retornado. + +- `0` + +Valor para arquivos inválidos, às vezes veículos (assim como `65535`). Também é o valor para a ausência de muitas coisas, como estados de ação e armas. + +- `255` + +Valor para times e menus inválidos. + +- `-1` + +Valor para gang zones e estados de arma inválidos. + +Além disso, muitas bibliotecas usam `0x80000000` e `-1` para estados inválidos porque é muito menos provável que eles acabem se tornando um ID válido. 65535 é um número bem grande, mas um servidor grande pode facilmente ter mais objetos do que isso. + +### Funções por jogador + +- `CreateObject` e `CreatePlayerObject` + +Tem versões globais e por jogador. + +- `SetPlayerMapIcon` + +Não tem versão global. + +- `SetGravity` + +Sem versão por jogador, apesar de possivelmente ser uma das funções por jogador mais solicitadas, e adicionada quase instantaneamente pelo YSF e outros plugins. + +- `CreateVehicle` + +Sem versão por jogador, apesar de também ser solicitada repetidamente. Mas também não foi adicionada por nenhum plugin (público), nem mesmo pelo plugin streamer. + +- `SendClientMessage` e `SendClientMessageToAll` + +Tem versões globais e por jogador, mas a versão por jogador é o padrão, diferente da maioria das outras funções. + +- `GangZoneShowForPlayer` e `GangZoneShowForAll` + +Menus, Gang Zones e Text Draws são as únicas funções padrão do SA:MP em que você pode especificar exatamente quais jogadores podem vê-los. Todas as outras são para todo mundo ou apenas uma pessoa. Claro, bibliotecas e plugins desde então expandiram muito esse modelo, e a maioria dos bons agora permite controle muito granular sobre quais subconjuntos de jogadores (grupos) podem usar qualquer entidade específica. + +### IDs + +- `CreateObject` e `CreatePlayerObject` + +O pool de IDs dessas funções é compartilhado. Se um objeto global tiver ID `4`, nenhum objeto de jogador poderá ter ID `4`, mas vários jogadores poderiam ter objetos diferentes todos com ID `5`. + +- `Create3DTextLabel` e `CreatePlayer3DTextLabel` + +O pool de IDs é dividido: os primeiros `1024` IDs são globais, os segundos `1024` são por jogador. Cada jogador pode ter até `2048` textos 3D, mas apenas `1024` de cada tipo, apesar de isso não fazer diferença nenhuma no lado do cliente. + +- `SetPlayerMapIcon` + +Os IDs são especificados manualmente, até o limite de 32. Por um tempo esse limite não era verificado no lado do cliente, levando a um possível exploit de ACE. + +- `ShowPlayerDialog` + +Os IDs são especificados manualmente, sem limite algum. Os IDs também são totalmente inúteis, já que um jogador só pode ver um diálogo por vez. + +- `SetTimer` + +Os IDs dão a volta, sem verificar se um timer existente tem o mesmo ID. Você teria que iniciar mais de 4.000.000.000 timers em algum momento para encontrar esse problema, mas ele poderia acontecer — eles nem precisam continuar todos rodando. + +E, claro, algumas pessoas dependem de IDs serem alocados em ordens muito específicas, e depois se perguntam por que o modo inteiro quebra quando, por exemplo, adicionam ou removem um único veículo. + +## Compatibilidade + +Então, novamente, precisamos deixar muito claro que todo *"código SA:MP"* existente funcionará. O que isso significa exatamente? Qualquer código que seja: + +- Escrito em pawn. +- Use a API original do SA:MP sem plugins. +- Seja recompilado com nossos includes. +- Já use o compilador da comunidade. + +Vai funcionar. + +No entanto: + +- Se você usa um plugin para escrever em uma linguagem diferente de pawn, esse plugin provavelmente precisará ser portado primeiro. Então seu código não funcionará imediatamente. +- Se você usa outros plugins, como streamer, YSF, audio etc.; eles podem já funcionar, podem precisar de portabilidade, ou podem ser totalmente supérfluos porque sua funcionalidade foi integrada ao servidor principal. Então seu código pode funcionar. +- Se você só tem o .AMX do seu modo e não o código-fonte original, por quê? De qualquer forma, embora todas as funções SA:MP existam, algumas foram refeitas ou substituídas por código pawn ou macros, e você DEVE recompilar. Então, se você não puder, seu código não funcionará de jeito nenhum. + +## Build + +### Exemplo + +Vamos começar vendo um modo SA:MP absurdamente simples. + +```c +#include + +main() {} + +public OnGameModeInit() +{ + SetGameModeText("Example Script"); + AddPlayerClass(0, 0.0, 0.0, 4.0, 0.0, 0, 0, 0, 0, 0, 0); + return 1; +} + +public OnPlayerSpawn(playerid) +{ + SetPlayerCheckpoint(playerid, 20.0, 20.0, 4.0, 2.0); + return 1; +} + +public OnPlayerEnterCheckpoint(playerid) +{ + SendClientMessage(playerid, 0xFF0000AA, "You won!"); + return 1; +} +``` + +Você nasce. Vai até o checkpoint. Você vence. + +### Conversão + +Para fazer o build disso para open.mp, precisamos mudar apenas o primeiro include e adicionar um define. + +Isto: + +```c +#include + +main() {} +``` + +Vira: + +```c +#define OPENMP_COMPAT +#include + +main() {} +``` + +O primeiro erro que você pode receber é: + +`open.mp scripts require the community compiler from: git.io/pawn-compiler` + +Se você receber isso, vá para https://git.io/pawn-compiler e baixe a versão 3.10.10 ou posterior do compilador. Para o lançamento, gostaríamos de uma ferramenta equivalente ao pawno com esse compilador já integrado, mas ainda não fizemos isso. Eu recomendo FORTEMENTE tentar compilar seu modo com esse compilador primeiro, pois ele reativou os avisos de correção de const, então é provável que você receba uma porção de novos avisos logo de cara (isso NÃO é um problema do compilador; são problemas no seu código que sempre existiram, mas eram ignorados antes). Você provavelmente também vai querer substituir seus includes por estes: + +https://github.com/pawn-lang/pawn-stdlib +https://github.com/pawn-lang/samp-stdlib + +Isso é uma coisa boa a fazer mesmo se você não usa open.mp, pois eles corrigem vários problemas de tags e const nos includes originais. + +### Avisos + +Se você não receber nenhum aviso usando o novo compilador com a nova versão de `a_samp`, agora verá uma porção de novos avisos parecidos com: + +`warning 234: function is deprecated (symbol "AddPlayerClass") Use "Class_Add" instead.` + +Você tem três opções — e todas são suportadas: + +- **Ignorar os avisos:** O código ainda funcionará. +- **Suprimir os avisos:** Troque `OPENMP_COMPAT` por `OPENMP_QUIET`: + +```c +#define OPENMP_QUIET +#include + +main() {} +``` + +- **Corrigir os avisos:** Algumas funções mudaram de nome para ficarem consistentes entre si; algumas funções mudaram parâmetros porque as antigas evoluíram e não expunham totalmente as capacidades do open.mp. Ainda não há uma forma simples de converter todas as funções, mas você pode deixar os avisos ligados enquanto converte o código aos poucos — as funções antigas continuarão funcionando perfeitamente bem. + +Há três estágios na conversão: + +### `#define OPENMP_QUIET` + +Usar esse define permite que seu modo compile sem novos avisos de funções obsoletas. Mas você não deve ficar com esse define, e as conversões implícitas só funcionarão para código pawn. Você pode converter código nesse modo, já que a nova API também funcionará, mas não pode usar o compilador para ver onde ainda restam problemas. + +### `#define OPENMP_COMPAT` + +Este é o segundo estágio. Quando você quiser começar a aproveitar todos os recursos melhorados do open.mp, como controles granulares de entidades por jogador e limites removidos, precisará começar a usar as novas versões das funções. As novas funções estão sempre disponíveis, mas talvez você não saiba todos os lugares que precisam de conversão. Isso dará avisos para as funções antigas, mas elas ainda funcionarão, permitindo converter partes do seu modo uma de cada vez. + +### Sem define + +Quando você achar que terminou de converter seu código, remova os defines: + +```c +#include + +main() {} +``` + +Agora você recebe erros em vez de avisos para qualquer código antigo ainda em uso. + +## Nova API + +Agora que vimos quais eram os problemas da API antiga e como encontrar onde você precisa aplicar a nova API, devemos de fato olhar para essa nova API em termos dos problemas identificados anteriormente: + +### Tags + +As funções agora usam tags quase em todos os lugares. Tentamos encontrar um equilíbrio entre avisos de tags demais e pouca informação útil, mas avisos existem por um motivo e podem ajudar a encontrar problemas que você talvez tenha deixado passar. Por exemplo, passar um veículo como parâmetro para uma função de objeto, ou dar a alguém uma arma que não existe: + +```c +// Nenhum aviso para este código, apesar de ele estar claramente errado. +new object = CreateObject(various, parameters, here); +PutPlayerInVehicle(playerid, object); + +// O mesmo aqui - não existe arma 20, apesar de estar entre IDs de armas válidos. +GivePlayerWeapon(playerid, 20, 200); +``` + +Seria muito melhor se todos os trechos de código claramente errados pudessem gerar avisos. Esse é o poder de uma linguagem type-safe, e embora pawn não seja totalmente type-safe, podemos chegar perto com tags. Esses exemplos viram: + +```c +// warning 213: tag mismatch: expected tag "Vehicle", but found "Object" +new Object:object = Object@Create(various, parameters, here); +Player_PutInVehicle(playerid, object); + +// warning 213: tag mismatch: expected tag "WeaponType", but found but found none ("_") +GivePlayerWeapon(playerid, 20, 200); + +// Isto não gera aviso: +GivePlayerWeapon(playerid, WEAPON_COLT45, 200); +``` + +### Nomeação + +A maioria das novas funções usa um refinamento do esquema de nomes já adotado por muitas bibliotecas e plugins: `Module_VerbNoun`. Algumas não usam, quando são casos isolados que não se encaixam em nenhum módulo maior, mas na maior parte você possivelmente consegue adivinhar o nome de uma função de que precisa. Chega de ficar se perguntando se era "Rot" ou "Rotation" para esse tipo de elemento; não há abreviações, a menos que o nome da função fique longo demais (32+ caracteres, o compilador não aceita). Quer mudar o modelo de um objeto? `Object_SetModel`. Quer mostrar texto para um jogador? `Text_Show`. + +Há um conjunto limitado de verbos: `Get`, `Set`, `Create`, `Destroy`, `Add`, `Remove`, `Show`, `Hide`, `Run`, `Move`, `Stop` e `Count`. Mais podem ser adicionados e podem aparecer em situações especiais, mas, em geral, se um desses se encaixa, provavelmente é ele. De longe os mais comuns são `Get` e `Set`, que, diferente do SA:MP, agora sempre vêm em pares: se você pode definir qualquer parâmetro, também pode obtê-lo depois. Eles também são os verbos que mais frequentemente vêm com um substantivo — você precisa especificar o que obter ou definir: `Health`, `Position`, `Model`, `Width` etc. + +Alguns exemplos: + +```c +native bool:Menu_SetDisabled(Menu:menuid, bool:disabled); +native bool:Menu_GetDisabled(Menu:menuid); + +native bool:Text_SetAlignment(Text:text, alignment); +native Text_GetAlignment(Text:text); + +native bool:Object_Move(Object:objectid, Float:posX, Float:posY, Float:posZ, Float:speed, Float:rotX = FLOAT_NAN, Float:rotY = FLOAT_NAN, Float:rotZ = FLOAT_NAN); + +native DBResult_CountRows(DBResult:dbresult); + +native Player_Spawn(Player:playerid); +``` + +Observe que os nomes de módulo e tag sempre correspondem — `Vehicle`, `DB`, `Player` etc. [Há motivos além da consistência para isso](https://github.com/pawn-lang/compiler/issues/234): dá uma interface mais parecida com OO e é mais fácil de lembrar. No entanto, você talvez tenha notado em um exemplo anterior a função `Object@Create`, não `Object_Create`. A razão para isso está no primeiro parâmetro. + +Em todos os sete exemplos imediatamente acima, o primeiro parâmetro é a entidade (objeto, veículo, jogador etc.) sobre a qual a operação é realizada. Você quer obter a posição de uma entidade específica. Quer mover uma entidade específica. Quer obter o tempo restante de uma entidade específica. Isso novamente mapeia para a API parecida com OO: `Player_Spawn(playerid)` pode ser pensado como `player.Spawn()`. PAWN não pode fazer isso, mas isso não significa que outras linguagens conectadas a essa API não possam. Em termos de C++: `_` é `.` ou `->` e sempre precisa de um ID válido dado como primeiro parâmetro. No entanto, a função `Dialog_IsValid(Dialog:id)`, por definição, pode não ter um ID válido como primeiro parâmetro (ou qual seria o propósito dela[^1]?), e `Icon_Create(image, Float:x, Float:y, Float:z)` nem sequer recebe um ID. Assim, elas viram `@` — `::` na sintaxe de C++. Elas podem nem receber um ID, e definitivamente não precisam de um válido (`@Destroy` também entra nesse grupo de funções, já que destruir uma entidade é uma operação logicamente externa a uma entidade, não uma operação sobre a entidade). + +### Constantes + +Para começar, em vez de `#define` para tudo, usamos `const` e `enum` tanto quanto possível, exceto onde esperamos que coisas sejam sobrescritas (`MAX_PLAYERS`): + +```c +enum ObjectMaterialTextAlignment +{ + MATERIAL_TEXT_ALIGN_LEFT, + MATERIAL_TEXT_ALIGN_CENTRE, + MATERIAL_TEXT_ALIGN_RIGHT, +}; +``` + +`Object_SetMaterialText` agora aceitará apenas um desses três valores, e nada mais. + +E quanto aos IDs inválidos? Também os tornamos consistentes. Todas as entidades agora usam o mesmo valor inválido, bem fora do intervalo de valores possivelmente válidos — o open.mp removeu quase todos os limites, então tornar um valor como `65536` inválido simplesmente não funcionará. Qual é esse novo valor inválido? Ainda não decidimos... Há dois principais candidatos, ambos com prós e contras, e a decisão não é tão fácil quanto pode parecer à primeira vista. Mas felizmente isso não faz grande diferença para o trabalho interno, já que podemos trocar quase instantaneamente. + +As duas escolhas são explicadas abaixo, e gostaríamos de receber feedback sobre isso se possível: + +#### `0` + +Usar `0` como valor inválido tem algumas vantagens: + +- ele não é um índice inválido, então, quando retornado e não verificado corretamente, seu código não vai travar. Talvez não funcione perfeitamente, mas pelo menos continuará fazendo alguma coisa. +- É muito fácil de verificar, e a intenção fica óbvia com ele: + +```c +new Object:object = Object@Create(various, parameters, here); +if (object) +{ + Object_SetMaterialText(object, "Hello"); +} +else +{ + printf("Couldn't create the object."); +} +``` + +- Uma variável recém-declarada é, por padrão, um valor inválido: + +```c +new Dialog:d; +``` + +Um dos bugs mais comuns que as pessoas encontram é o código só funcionar para o jogador 0, porque esqueceram de inicializar uma variável. Se não houver jogador/objeto/veículo 0, o código não será aplicado a ninguém — é melhor não promover nenhum jogador a admin do que promover o jogador errado. + +#### `-1` + +Usar `-1` como valor inválido tem algumas vantagens: + +- Ele É um índice inválido. Não ser um foi listado como vantagem para `0` porque seu código muitas vezes continuará rodando em vez de travar, mas com crashdetect isso pode ser bom — há um bug no seu código e o crash dirá exatamente onde ele está, às vezes até a linha exata do código-fonte. O que é melhor: continuar silenciosamente ou terminar de forma barulhenta? +- As pessoas estão acostumadas a `0` como valor válido na maior parte do tempo. Programadores começam a contar em `0`, então ele deveria ser válido, e algo fora do domínio dos inteiros positivos deveria ser inválido. +- Em matemática sem sinal, ele é o maior inteiro possível: `0xFFFFFFFF`, `4294967295`. Isso significa que o limite interno rígido para qualquer tipo de entidade é o maior possível: `4,294,967,295` itens antes de ficar sem IDs (e memória). + +### Funções por jogador + +Em resumo, elas não existem mais. Toda função `ForPlayer`, `ForAll`, `CreatePlayerX` etc. foi substituída por uma função simples: `X_Display` (onde `X` é qualquer entidade), e `X_Has` para verificação: + +```c +Object_Display(objectid, playerid, true); // Mostra. +Object_Display(objectid, playerid, false); // Oculta. + +Text_Display(textid, true); // Mostra para todos. + +if (Zone_Has(zoneid, playerid)) +{ + // O jogador TEM PERMISSÃO para ver a gang zone. +} +``` + +YSI usava `X_SetPlayer`, mas mostrar coisas para jogadores é a coisa mais fundamental a fazer, então merece seu próprio verbo. Algumas bibliotecas usam `X_Show` e `X_Hide`, mas isso são duas funções, o que só leva a código extra ao verificar qual usar: + +```c +if (var) Checkpoint_Show(cpid, playerid); +else Checkpoint_Hide(cpid, playerid); +``` + +vs + +```c +Checkpoint_Display(cpid, playerid, var); +``` + +Observe que apenas chamar `X_Display` pode não mostrar o item de fato. Um objeto do outro lado do mundo ainda não ficará visível. Um checkpoint em outro mundo virtual não ficará visível mesmo que esteja bem ao seu lado. Para entidades do mundo, isso apenas diz que o jogador tem permissão para vê-la, não que ele atualmente consegue vê-la. Por outro lado, para elementos de HUD como menus e diálogos, isso os mostra instantaneamente e pode ocultar outros quando apenas um é permitido. + +### IDs + +Com a remoção dos pools por jogador e a unificação dos IDs inválidos, isso não é mais um problema. + +## Funções mais inteligentes. + +As funções `X_Display` mostradas acima podem receber dois parâmetros — entidade e estado de exibição, para permitir que todos os jogadores as vejam; ou, alternativamente, três parâmetros — entidade, jogador e estado de exibição. Há outras funções que também são inteligentes com seus parâmetros. Um conjunto de exemplos são as várias funções de rotação. Como mencionado na introdução, há pelo menos quatro maneiras diferentes de obter e definir rotações para diferentes entidades. Agora há uma só: `X_SetRotation` e `X_GetRotation`. Por exemplo: + +```c +// Obtém apenas `z`. +z = Player_GetRotation(playerid); + +// Obtém os ângulos Euler x, y e z. +Object_GetRotation(objectid, x, y, z); + +// Obtém os ângulos quaternion w, x, y e z. +Vehicle_GetRotation(vehicleid, w, x, y, z); +``` + +Qual é usado para qual entidade? Todos: + +```c +// Obtém apenas `z`. +z = Object_GetRotation(objectid); + +// Obtém os ângulos Euler x, y e z. +Object_GetRotation(objectid, x, y, z); + +// Obtém os ângulos quaternion w, x, y e z. +Object_GetRotation(objectid, w, x, y, z); +``` + +Os significados dos parâmetros e do retorno são determinados pelo número de parâmetros fornecidos. O mesmo vale para Set: + +```c +// Define apenas `z`. +Vehicle_SetRotation(vehicleid, z); + +// Define os ângulos Euler x, y e z. +Vehicle_SetRotation(vehicleid, x, y, z); + +// Define os ângulos quaternion w, x, y e z. +Vehicle_SetRotation(vehicleid, w, x, y, z); +``` + +## Conclusão + +Tentamos muito criar uma API que seja fácil de usar, fácil de aprender, mas também compatível com versões anteriores. Muito do sucesso do SA:MP vem da sua facilidade de uso, e queremos manter isso, mas também sabemos que há usuários avançados que querem extrair muito mais do próprio código. Encontrar esse equilíbrio é sempre difícil, especialmente quando quem mais comenta são os mais experientes — aqueles que conhecem a linguagem por dentro e por fora e querem levá-la mais longe. Isso cria um sistema que se autosseleciona para recursos avançados em detrimento dos iniciantes. Não queremos isso, mas ainda assim queremos ouvir suas opiniões. Quais recursos de linguagem e API você gosta, e quais não gosta? Quais funções ajudariam você a tirar o máximo do seu código? Você acha o novo design simples ou complicado demais? Você está de boa com os nomes desorganizados das funções atuais? Eles cumprem seu propósito, então por que mudá-los? Como iniciante, você teria gostado que algo fosse feito de outra forma? + +Por favor, compartilhe qualquer feedback que tiver no tópico do burgershot abaixo. Adoraríamos ouvir você: + +https://forum.open.mp/showthread.php?tid=1036 + +[^1]: Nota lateral interessante. Graças à forma como abstraímos o código da API de scripting, Dialog_IsValid é implementada como: + + ```c + SCRIPT_API(Dialog_IsValid, bool(Dialog_s)) { return true; } + ``` + + É literalmente isso. Nenhuma implementação real é necessária porque, para a função ser chamada, a busca pela entidade deve ter sido bem-sucedida, e assim podemos retornar true instantaneamente. diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-11-23-interview.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-11-23-interview.md new file mode 100644 index 00000000000..88d7d0e21ee --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2020-11-23-interview.md @@ -0,0 +1,1369 @@ +--- +slug: interview +title: Podcast ao vivo +authors: potassium +--- + +Recentemente organizamos um podcast de perguntas e respostas ao vivo com a equipe de desenvolvimento do open.mp, cobrindo tudo, desde atualizações do projeto e melhorias de scripting até planos futuros e envolvimento da comunidade. Se você perdeu, pode assistir à gravação completa aqui! + + + +No dia 24 de outubro tivemos um podcast de perguntas e respostas com os devs, que foi gravado para vocês abaixo: + +## Vídeo + +https://www.youtube.com/watch?v=bTYWWsXkcDo + +## Transcrição + +**Potassium:** +olá a todos, bem-vindos à nossa primeira live de open multiplayer +hum, alguém pode fazer um teste de microfone, alguém pode me dizer se isso está funcionando, por favor? jamie? + +**everyone:** +está funcionando +está funcionando +ok +sim +sim, ouvi saindo do outro lado +sim, tem um atraso considerável +sim, tudo bem + +**Potassium:** +certo, hum, olá, uh, e aí +finalmente estamos aqui fazendo isso, eu acho, hum + +**Southclaws:** +muitos dias de planejamento + +**Potassium:** +sim +talvez devêssemos começar nos apresentando, então... **Southclaws**? + +**Southclaws:** +sou eu + +**Potassium:** +conte a todos um pouco sobre você e o que você faz aqui + +**Southclaws:** +uh sim, acho que estou por perto no SAMP desde tipo 2008 ou 2007, não lembro... faz muito tempo... hum, no momento eu meio que faço as coisas do site, gerencio a wiki e faço um pouquinho de código, mas não muito, esses caras são muito melhores nisso do que eu. mas sim, eu faço principalmente as coisas da wiki e do site, então essa é meio que a minha área + +**Potassium:** +e **Y_Less**? + +*alerta da stream com CJ dizendo "here we go again"* + +**Y_Less:** +oi, eu sou Y_Less: +estou no SAMP há mais tempo do que você +entrei para a equipe beta antes mesmo de ele ser lançado, então é isso, já faz um tempo. sou um ex-dev, não tenho total certeza se preciso me apresentar, mas é isso + +**Southclaws:** +não, provavelmente não + +**Potassium:** +provavelmente não + +**Southclaws:** +tenho certeza de que todo mundo conhece você + +**Potassium:** +só por garantia + +**Y_Less:** +scripters me conhecem, mas jogadores não necessariamente + +**Potassium:** +não, tenho quase certeza de que todo mundo conhece + +**Y_Less:** +também sou a única forma de dev atualmente não removida da página "about" do client + +**Potassium:** +uhhh... legal... eu acho? + +**BigETI:** +isso é uma conquista + +**Potassium:** +é uma conquista, sim +ok, josh, sua vez + +**j0sh.../alasnkz:** +bem, eu sou josh e sou um dos principais desenvolvedores do open.mp +estou no samp há pelo menos sete anos +comecei a programar há seis anos por causa do samp +e se você esteve no discord, sabe quem eu sou, estou sempre lá e sempre disponível para conversar se você precisar de ajuda com qualquer coisa + +**Potassium:** +ah, isso foi muito fofo +quem é você e o que você fez com o josh? +ok, Amir? + +**iAmir:** +bem, eu sou Amir e estou por aqui desde 2010, eu acho, foi quando comecei a jogar samp na verdade. eu apenas faço parte da equipe de desenvolvimento do open.mp e meio que ajudo com código e coisas assim + +**Potassium:** +legal! e bigETI? + +**BigETI:** +sim, eu sou bigeti, tenho 27 anos, comecei a jogar samp por volta de 2009, contribuí para projetos, tive meus próprios servidores etc, e agora também sou contribuidor do +open.mp + +**Potassium:** +incrível, e michael? + +**JustMichael:** +eu sou JustMichael:, estou por aqui desde 2007, fui dono de algumas comunidades, lutei para subir, mas hoje em dia eu basicamente só sigo o Southclaws: e gerencio todos os projetos que ele abandonou! e fora isso eu trabalho no open.mp no tempo livre + +**Southclaws:** +ele é o pai substituto de tudo que eu criei + +*todo mundo ri* + +**Potassium:** +incrível! + +**Y_Less:** +quem é você, Potassium? + +**Potassium:** +essa é uma boa pergunta! então eu sou Potassium, obviamente, estou na comunidade samp desde mais ou menos 2008/2009 talvez... então tipo 10 anos... ou mais, eu acho... matemática! +não sou scripter, fico dizendo para todo mundo que talvez um dia eu seja, provavelmente não vou ser, mas enfim! eu realmente não tenho uma história, sou só uma pessoa aleatória do fórum do samp e eu só, não sei, eu simplesmente amo esta comunidade e quero fazer parte de mantê-la viva, então eu meio que me convidei para esta equipe... então yay! + +**Y_Less:** +tudo bem, você faz um trabalho bem importante + +**BigETI:** +você é definitivamente bem-vinda! + +**Potassium:** +eu não consigo fazer nenhuma coisa técnica, elas passam completamente por cima da minha cabeça, então só demos ao meu papel o nome de "relações públicas" e eu posto memes idiotas de vez em quando... mas tudo bem! alguém precisa fazer isso! + +**Potassium:** +então faz sentido explicar rapidamente sobre o que é o openmp de fato ou? acho que, sim, acho que deveríamos, só caso alguém esteja ouvindo e não tenha certeza. então basicamente todos nós somos jogadores old school de san andreas, como vocês acabaram de ouvir, e todos fazemos parte de uma comunidade +chamada san andreas multiplayer, é uma modificação multiplayer para san andreas e está um pouco desatualizada agora, acho que dá para dizer isso, então estamos meio que tentando trazer mais vida de volta para ela porque ainda não estamos prontos para deixar nossa pequena comunidade morrer. isso é um resumo justo? + +**everyone:** +acho que sim +sim + +**Y_Less:** +quero meio que abordar a grande pergunta para começar, sobre o PORQUÊ. em alguns aspectos +nós realmente não queremos criar o open.mp - estávamos perfeitamente felizes jogando samp, é um joguinho legal, ele faz tudo que queremos, mas kalcor o escreveu, ele tem o código-fonte e +coisas assim, ele teve alguma ajuda, e resumindo ele não estava mais interessado em mantê-lo, o que é ok e acontece com todo mundo, e eu só quero deixar claro que não tenho ressentimentos em relação a ele por isso, porque todo mundo segue em frente eventualmente, você ganha novos interesses, mas +ele decidiu que queria simplesmente levar tudo com ele. ele não queria passar o código-fonte adiante, só queria parar, então achou que todos os outros também deveriam parar. e nós gostávamos bastante daqui, então não paramos. + +**Potassium:** +correto + +**JustMichael:** +sim, isso parece certo + +**Y_Less:** +como eu disse, se ele quer seguir em frente e ir para outras coisas, isso é prerrogativa dele + +**Potassium:** +sim, isso mesmo, não estamos julgando, só estamos um pouco tristes. mas tudo bem, porque vamos consertar. podemos fazer algo a respeito, então faremos! + +**JustMichael:** +sim, vamos seguir para as próximas coisas maiores + +**Potassium:** +sim, isso mesmo. certo, então tivemos várias perguntas no nosso fórum, que aliás é +https://forum.open.mp então cadastrem-se lá! +então acho que vamos direto a elas. +a pergunta mais urgente agora obviamente é sobre o drama recente do samp. então, para quem não sabe, o fórum do samp e a wiki do samp estão offline há algumas semanas, e não queremos fazer suposições, mas não parece que eles vão voltar +tão cedo. acho que essa é uma suposição bem justa de se fazer. + +**Y_Less:** +os links foram removidos da página inicial, se fosse apenas algo temporário ele +provavelmente não teria removido os links. + +**Potassium:** +sim, isso mesmo, então não parece que eles vão voltar. então as pessoas meio que querem saber quais são nossos pensamentos sobre isso, o que achamos que realmente aconteceu? então... microfone aberto... **Southclaws**? alguém? + +**Y_Less:** +é basicamente o que eu acabei de dizer, kalcor esteve desinteressado por anos, é por isso que +simplesmente houve zero desenvolvimento, e vários de nós, quando eu estava na equipe beta, continuávamos tentando empurrá-lo para lançar atualizações e coisas assim, e na verdade a comunidade inteira estava gritando por atualizações, ele não queria porque tinha perdido o interesse, queria seguir em frente e isso... como eu já disse, tudo bem, não nos importamos que as pessoas sigam em frente e deixem +projetos, foi o fato de ele se recusar a passar as rédeas para qualquer outra pessoa, isso é apenas uma +continuação disso, os fóruns eram bem enormes, não eram fáceis de administrar, é quase um trabalho em tempo integral só moderá-los. e eu suspeito que ele simplesmente perdeu totalmente o interesse e decidiu que não quer mais fazer isso, mas não quer que ninguém continue seu legado, então ele está tirando tudo do ar. estou um pouco confuso que a página inicial ainda esteja lá. + +**Southclaws:** +eu imagino que provavelmente seja porque a página inicial deve custar quase nada para manter online, enquanto o fórum provavelmente exigia algum tempo e despesa para +de fato funcionar. imagino que seja por isso. + +**BigETI:** +você ainda pode baixar o samp pela página inicial principal + +**JustMichael:** +sim, isso é bom, pelo menos eles podem fazer isso. mas se completarmos nossa missão +eles não precisarão! + +**Potassium:** +pessoalmente eu só espero que kalcor esteja bem! e se ele pegou COVID e está no hospital e não consegue manter + +**Southclaws:** +isso seria muito ruim + +**Potassium:** +e se simplesmente expirou e ele não consegue colocar de volta porque está no hospital + +**JustMichael:** +isso seria extremamente infeliz + +**Potassium:** +e aí ele volta e há tipo... um motim... enfim + +**JustMichael:** +e enquanto ele estava no hospital ele por acaso removeu o link do fórum e da wiki...? + +**Potassium:** +ah sim... justo + +*todo mundo ri* + +**Y_Less:** +estou só pensando que talvez tivéssemos ouvido falar disso + +**Potassium:** +sim, provavelmente teríamos ouvido falar disso, você tem razão + +**Y_Less:** +ou talvez não, porque até os beta testers mal ficam sabendo de qualquer coisa, posso falar por +experiência pessoal, as pessoas continuavam me perguntando quando sai a próxima versão? +eu sei tão pouco quanto vocês. mas temos nosso próprio fórum privado e ele está morto. + +**JustMichael:** +ele acabou sendo bem ruim em comunicar qualquer coisa para qualquer um dos devs + +**Potassium:** +hora de seguir em frente. sobre o assunto de fóruns, nosso fórum e nossa wiki parecem ser substitutos bastante populares para os do samp, então fiquem à vontade para conferir + +**Y_Less:** +eles não estão mortos + +**JustMichael:** +estão muito ativos e mantidos, mais do que eu já vi + +**Potassium:** +sim, particularmente para ajuda com scripting + +**Southclaws:** +sim, as contribuições para a wiki têm sido ótimas, quando a wiki saiu do ar, ter +um monte de gente copiando páginas da wiki antiga para a nova foi muito bom, então um salve para todos que contribuíram, obrigado, isso foi muito legal. as coisas de tradução são ótimas porque acho que isso é algo que a wiki antiga definitivamente não tinha, ela tinha algumas páginas que estavam traduzidas, mas acho que não muitas. + +**JustMichael:** +acho que era tipo polonês, brasileiro e... sim... faltava muita coisa. + +**Southclaws:** +sim, traduzir isso é definitivamente uma prioridade e temos algumas pessoas boas para nos ajudar com isso, então isso é brilhante + +**Potassium:** +sim, isso é incrível. só para registrar, https://forum.open.mp é o nosso fórum e https://open.mp/docs é a nossa wiki, então vão lá! +então obviamente o próximo barulho de alerta do discord que me assustou, desculpa! a próxima pergunta mais frequente é e sempre será a data de lançamento. então obviamente não temos uma data, nunca daremos uma data específica porque somos todos voluntários e fazemos isso no nosso tempo livre, mas temos uma ideia aproximada de talvez tipo uma porcentagem de quão avançados estamos antes de podermos torná-lo público? estamos em 1%? estamos na metade? estamos em 90%? o que vocês acham? + +**JustMichael:** +quer dizer, estamos bem perto, não estamos? + +**Y_Less:** +sim, acho que a maioria dos nossos grandes sistemas, a maior parte, está pronta. dizem que os primeiros 90% levam 90% do tempo, e os últimos 10% levam os outros 90% do tempo porque é tudo aquele tipo de ajuste fino, e há bugs, e quando isso e isso e isso e isso acontecem juntos, de repente tudo quebra. a maior parte do que chamamos de "módulos" já está pronta, posso explicar módulos depois, mas essencialmente os grandes blocos de código já estão prontos. é só conectá-los, garantir que todos os pequenos recursos extras estejam lá. está progredindo de forma bastante constante, especialmente agora recentemente, + +**JustMichael:** +sim, tivemos um impulso bem grande de desenvolvimento ativo recentemente, o que é muito bom + +**Potassium:** +eu ia justamente perguntar se alguém mais tinha algo a acrescentar a isso + +**j0sh...:** +acho que depende do que você define como público, posso praticamente dizer que estamos bem perto +de ter um servidor de teste beta, tenho certeza de que estamos perto disso. mas um lançamento público no sentido de todo mundo ter o executável obviamente está um pouco mais distante, mas acho que um servidor de teste virá relativamente em breve. + +**Potassium:** +woohoo! + +**JustMichael:** +sim, precisamos de uma boa quantidade de tempo para testar todo o progresso até agora porque ainda haverá edge cases + +**Potassium:** +vocês ouviram isso, chat?! um servidor de teste virá relativamente em breve! gravem as palavras dele! +certo, então a maioria das perguntas daqui em diante é do ponto de vista de scripting, então obviamente eu não faço ideia sobre essas coisas, então é aqui que vocês brilham! então vocês mencionaram módulos há pouco, queriam explicar um pouco isso? ou não queriam? + +**Y_Less:** +sim, basicamente módulos são uma extensão de uma tendência geral no desenvolvimento de bibliotecas e coisas assim que se desenvolveu ao longo dos anos, para isolamento de código, então todos os objetos, todo o código relacionado a objetos, isso é um módulo. todo o código relacionado a checkpoints, isso é um módulo. veículos é um módulo separado. + +**Potassium:** +então em termos de plugins e filter scripts como temos no samp, é isso que estamos... estamos renomeando eles para módulos? acho que vi algo sobre isso antes, mas não entendo essas coisas! + +**Y_Less:** +não exatamente, módulos são mais como um bloco de código que fornece alguma funcionalidade, então seus filter scripts... quer dizer, nós não temos mais filter scripts de verdade, temos apenas scripts, porque game modes e filter scripts eram uma distinção arbitrária e inútil desde o começo. ainda temos plugins, mas há plugins legados, que são todos os existentes, +a maioria deles deve funcionar, alguns não vão. + +**JustMichael:** +qualquer um que faça memory hacking não vai + +**Y_Less:** +sim, se eles usam memory hacking não vão funcionar porque isso é só alterar valores na memória em locais muito específicos, mas como é um código completamente diferente, tudo +mudou de lugar + +**BigETI:** +sim, mas aí se alguém quiser fazer, digamos, um plugin de memory hacking funcionar no openmp, pode simplesmente usar a API existente no openmp em vez de hackear memória + +**JustMichael:** +sim, você não vai precisar seguir esse caminho mais + +**Y_Less:** +sim, então temos uma API C completa, os plugins legados tinham cerca de 3 funções que podiam chamar no servidor, e era isso. e havia todo tipo de workaround e formas horríveis de +colocar natives a partir de plugins, agora você pode fazer isso diretamente, então 90% da necessidade de plugins de memory +hacking simplesmente desaparece. coisas como samp gdk, que era só puxar funções pawn +a partir de plugins, isso acabou. os plugins são todos esses legados, e módulos são basicamente os substitutos. como plugins, mas muito mais poderosos. + +**Potassium:** +legal. estou só sorrindo e concordando porque não entendo, mas tenho certeza de que a maioria dos nossos espectadores entende, então isso é incrível! + +**Y_Less:** +se alguém quiser algum esclarecimento sobre isso, é só perguntar! talvez você esteja no mesmo barco que a Potassium + +**Potassium:** +correto! então obviamente temos nosso fórum para perguntas assim, mas também teremos uma pequena sessão de perguntas ao vivo no final, então fiquem por aí! + +**JustMichael:** +também não é como se não fôssemos documentar o código quando ele realmente for lançado, então sabe, se você está tendo dificuldade para entender o que qualquer uma dessas coisas é, teremos algum tipo de explicação que simplesmente diz o que é. + +**Potassium:** +então recebemos algumas perguntas sobre limites, sei que conversamos sobre isso no nosso último Q&A, e acho que vocês disseram que não haverá limites em coisas como veículos e objetos, certo? + +**BigETI:** +não há razão para ter limites arbitrários, mas agora o openmp será apenas um lançamento do servidor por enquanto + +**Potassium:** +lançamento do servidor + +**BigETI:** +então você precisa torná-lo competitivo com san andreas multiplayer, portanto precisamos +emular limites, mas internamente no openmp não há limites do lado do servidor. depende apenas do quanto sua máquina é capaz de fazer + +**JustMichael:** +sim, então parece que na primeira versão os limites terão que existir +até lançarmos nosso próprio client + +**Y_Less:** +um streamer interno + +**BigETI:** +não podemos ultrapassar os limites do jogo agora + +**JustMichael:** +sim, isso é verdade, sim + +**Y_Less:** +houve uma questão interessante com limites que estávamos discutindo semana passada, o próprio servidor também pode fazer stream de jogadores, então em teoria você poderia ter jogadores ilimitados no servidor mesmo com este client legado do samp, basicamente apenas enviamos os jogadores mais próximos de você, sincronizamos eles, e então quando você se afasta mudamos quais jogadores estão sincronizados. mas tivemos que desativar isso por padrão porque significa que os IDs de todos ficam constantemente +mudando, então eu me conectaria ao servidor e teria um ID de servidor 27, mas quando sou streamado para você eu tenho seu ID local 3. estou sendo streamado para outra pessoa e tenho um +ID local para ela de 17. então você, como admin, vê que estou trapaceando e digita /ban 5 porque acha que eu sou o ID 5, mas o servidor acha que sou o ID 27. e traduzir isso quando as pessoas estão usando IDs crus em vez de nomes é complicado. decidimos desativar isso por enquanto e +torná-lo opcionalmente habilitado se as pessoas quiserem, mas com a ressalva de que o script delas precisará estar ciente disso e, por exemplo, se em um comando elas apenas usam strval para pegar o ID digitado, não façam isso porque provavelmente estará errado, ou façam isso e então traduzam de ID local para ID do servidor. sscanf provavelmente já dará suporte a isso, mas se você digitar "u", se você +já usa sscanf com "u", ele vai traduzir automaticamente. alguns scripts precisarão ser atualizados para dar suporte a isso. + +**Potassium:** +na verdade a próxima pergunta era "ainda estaremos limitados a 1000 slots de jogadores?" então acho que isso meio que se conecta. + +**JustMichael:** +a resposta para isso é não! + +**Y_Less:** +se você habilitar + +**BigETI:** +eu queria acrescentar a isso, então nossa ideia é ter tipo, você pode configurar o que quer limitar +para si mesmo, porque por exemplo você não quer um servidor onde possa gerar entidades infinitas, porque alguém poderia abusar disso e simplesmente derrubar seu servidor, então deveria haver alguma configuração que você possa fazer para limitar coisas, como jogadores ou veículos ou outra coisa. + +**Southclaws:** +sim, justo + +**Y_Less:** +só quero dizer que não sou eu no chat da twitch + +**Potassium:** +tudo bem, eu bani eles, aquele não é o verdadeiro Y_Less: no chat, ESTE é o verdadeiro Y_Less:! + +**BigETI:** +qual é sua conta da twitch, Y_Less:? + +**Potassium:** +tudo bem, não é importante. então seguindo com as perguntas da comunidade, as pessoas querem saber em quais linguagens além de pawn poderemos scriptar nossos servidores. + +**JustMichael:** +isso depende completamente dos desenvolvedores de plugins, já temos vários que podem ser facilmente portados, e alguns já funcionam, acho que bigeti você estava trabalhando em ou pelo menos pensando em escrever outro em C#, certo? + +**BigETI:** +eu estava pensando em implementar algum módulo que implemente outra linguagem, como por exemplo C#, porque hoje em dia C#... bem, antes de tudo não quero dizer que será oficialmente suportado, mas estou pensando em fazer um módulo, então ele será lançado sob meu nome. + +**JustMichael:** +sei que existem os sampnodes, isso é do amir, e eu também ajudo nisso às vezes, então isso deve ser fácil de portar se já não funcionar. + +**BigETI:** +acho que já funciona com openmp, seria melhor e mais rápido se usarmos a API C que estamos fornecendo para openmp, então é melhor do que passar pela camada pawn + +**JustMichael:** +sim, bem, teremos que encontrar uma forma de traduzir o plugin de rust de alguma maneira, ou o rust sdk, para fazer isso funcionar + +**Y_Less:** +samp gdk? + +**JustMichael:** +sim, vamos encontrar uma forma de dar suporte aos plugins rust atuais + +**BigETI:** +chega de fake amx bollocks + +**Y_Less:** +muitos desses plugins usam samp gdk para acessar pawn, só precisamos mudar o nível +mais baixo ali + +**JustMichael:** +sim, o de rust não... ele meio que tentou reinventar à própria maneira + +**Southclaws:** +não acho que a comunidade de rust seja tão grande + +**JustMichael:** +há alguns plugins dos quais as pessoas dependem + +**Southclaws:** +sim, talvez eu tente fazer isso, não sei, mas acho que seria legal escrever módulos em rust, não deve ser muito difícil. + +**Potassium:** +legal, ok, próxima pergunta: sampCTL/openCTL será o gerenciador de pacotes oficial do open multiplayer? + +**Southclaws:** +essa é minha área! sim, será, será renomeado, claro, sim, vai ser +Open Packet Manager - OPM. + +**JustMichael:** +foi isso que decidimos + +**Southclaws:** +foi isso que eu decidi! + +**JustMichael:** +eu te dei o nome! + +**Southclaws:** +estamos meio que trabalhando em recursos experimentais no momento, eu meio que acabei de construir algumas coisinhas experimentais rápidas e interessantes para isso, elas vêm nos próximos dias, tenho programado, então sim, estou pensando principalmente em coisas de experiência de desenvolvedor, então +coisas como logging e interface de linha de comando, variáveis de ambiente, sabe, todas as coisas que ajudam você a construir game modes mais rápido, implantá-los mais rápido e automatizar o máximo de coisas possível. como o processo de deploy e esse tipo de coisa, então +sim, é nisso que estou pensando de verdade. algum CTL permanecerá compatível e basicamente apenas adicionará suporte a openmp. então você pode mudar para ele apenas alterando uma string, em teoria, e alterando seus includes e então recompilar e simplesmente funcionará. esse é o plano, de qualquer forma! + +**JustMichael:** +isso vai ser muito divertido! + +**Southclaws:** +e então eventualmente ele também terá vários recursos novos, melhor tratamento de logs, melhor suporte a docker, melhor automação de deploy, coisas assim, algumas das quais serão implementadas no próprio openmp, muitas das coisas que sampCTL faz são na verdade para +contornar escolhas de design estranhas do servidor samp, então algumas dessas coisas +não precisarão acontecer, algumas delas serão simplesmente implementadas diretamente no openmp. então sim, espero que isso responda + +**Y_Less:** +sim, sampCTL/openCTL é oficialmente suportado, oficialmente endossado, provavelmente distribuído com ele, mas isso não significa que seja obrigatório, você pode escrever scripts sem ele, se não sabe como então não precisa começar a usá-lo + +**Southclaws:** +sim, é meio como você poder usar node.js sem npm + +**Potassium:** +legal, ok, próxima pergunta: quais são os tempos de build atuais do openmp? + +**Southclaws:** +isso significa os tempos de build do C++ ou de script? + +**Potassium:** +não sei + +**Southclaws:** +poderíamos responder ambos porque ambos são perguntas que podemos responder + +**BigETI:** +se você recompilar o projeto inteiro, faça um café! clique em compilar, faça um café, volte e estará pronto. + +**Y_Less:** +melhorou muito, antes era tipo meia hora, agora são cerca de oito minutos. +passei muito tempo melhorando isso. o módulo de player costumava estar em todo lugar, incluído por tudo, se você acidentalmente tocasse nesse arquivo era um rebuild completo. muda uma linha, é um rebuild +completo. + +**Southclaws:** +quanto aos scripts, isso não deve mudar muito, de verdade. temos uma camada de compatibilidade, scripts serão os mesmos, acho que há uma pergunta sobre isso mais tarde, então vou deixar para lá. + +**Potassium:** +certo, legal, obrigado. próxima pergunta é: muita gente queria saber se teremos um anti-cheat embutido? + +**JustMichael:** +não, acho que teremos um tipo de coisa muito pequena... não exatamente um anti-cheat, mas mais como +apenas vamos tentar bloquear alguns problemas conhecidos, exploits, coisas assim, mas acho que vamos deixar isso para outros desenvolvedores + +**Southclaws:** +vamos fornecer às pessoas as ferramentas para construir bons anti-cheats, provavelmente é a forma mais eficiente, porque então a comunidade pode se unir e construir soluções para cheats específicos. porque se a comunidade depender de nós para fazer isso, então isso simplesmente será ultrapassado porque a quantidade de pessoas desenvolvendo cheats vai superar a quantidade de pessoas desenvolvendo openmp + +**Y_Less:** +provavelmente vou postar um repo oficial para um, onde qualquer pessoa possa contribuir, e servi-lo como um módulo, porque a ideia é que eventualmente... bem, chama-se openmp, é para ser open source. atualmente não é porque ainda não terminamos o primeiro lançamento, mas quando estiver, +então podemos lançá-lo e outras pessoas podem contribuir, e essa é uma das principais áreas onde esperamos que contribuam. então ele terá um anti-cheat oficialmente incluído? sim, se vocês nos ajudarem! + +**Potassium:** +sim, é isso que importa de verdade, se a comunidade ajudar, então sim, teremos coisas assim! + +**Y_Less:** +muita gente esquece que o samp teve um, eles experimentaram um anti-cheat por um tempo, e por um tempo quero dizer cerca de um mês, antes de ficar completamente inviável porque olha só, eles bloquearam esse cheat, levou sete segundos para contornar, agora +você tem um novo cheat. é um jogo constante de gato e rato. + +**JustMichael:** +acho que o anti-cheat deveria ser separado, porque não vamos atualizar o mod tanto assim, não queremos atualizar todo dia ou toda semana, será mais uma coisa de longo prazo, mas um anticheat precisa ser atualizado com bastante frequência para combater os cheats, então +tê-lo como um módulo separado ou algo assim provavelmente seria melhor para servidores do que depender de nós esperando lançarmos no fim do mês ou por quanto +tempo nosso processo de atualização levar + +**Y_Less:** +sim, é meio isso que eu quis dizer sobre impulsioná-lo centralmente + +**Potassium:** +então se deixarmos aberto, todos podem contribuir e aí não fica inteiramente em vocês manter ele atualizado e tal. e nessa nota, mods CLEO, muita gente quer saber se ainda vão funcionar, ou mods em geral + +**JustMichael:** +eles são todos client-side + +**j0sh...:** +não haverá mudanças + +**JustMichael:** +não nesta versão, de qualquer forma + +**Y_Less:** +hum, então a menos que eles comecem a trapacear de uma forma que o servidor possa detectar + +**Potassium:** +ok, as pessoas queriam saber se o openmp terá uma função GPCI corrigida, tipo um serial no MTA + +**JustMichael:** +o problema com isso é que nunca será uma forma 100% garantida de banir alguém ou descobrir se aquele player é aquele player, porque qualquer pessoa com qualquer tipo de habilidade simplesmente usará algum tipo de modificador para o sistema e mudará algumas informações e então terá um ID completamente novo, então não há muito que possamos fazer com +isso, podemos fornecer as ferramentas, mas não posso dizer que elas algum dia vão funcionar 100%. + +**Potassium:** +legal, alguém tem mais algo a acrescentar a isso? não? ok, legal + +**Y_Less:** +tenho algo a acrescentar sobre o lado do AC, já que as pessoas estão perguntando um pouco mais sobre isso. então definitivamente não podemos ter um sistema geral de ban porque os servidores são independentes. se um servidor quer manter você e outro servidor quer banir você, isso +cabe ao servidor. se um servidor quer deixar você continuar trapaceando, isso cabe ao servidor. + +**Southclaws:** +eu costumava jogar em um servidor de trapaça e era muito divertido, só quero acrescentar isso + +**Potassium:** +sim, então uma lista global de bans não funcionaria por razões assim + +**Y_Less:** +ah, isso é uma ideia terrível, sei que outros mods fizeram isso, isso não significa que seja uma +boa ideia. quanto ao próprio anticheat, ele será separado e sim, você pode atualizá-lo na frequência que quiser. + +**Potassium:** +incrível. certo, recebemos muitas perguntas sobre raknet, acho que as pessoas só querem saber o que vocês pensam sobre ele, se openmp usará a mesma versão que samp usa, blá blá blá + +**j0sh...:** +há uma pequena diferença, mas nada extraordinário, basicamente precisamos da mesma versão major para ele realmente se comunicar perfeitamente com samp + +**Y_Less:** +sim, a camada de compatibilidade para se comunicar com clients samp existentes é basicamente a mesma. + +**iAmir:** +vai ser mudado, certo? então será mudado depois, por exemplo quando o client openmp for desenvolvido vamos adicionar uma nova biblioteca de networking, então por exemplo outras bibliotecas de networking por aí, cada uma delas provavelmente é melhor que raknet, especialmente a versão que estamos usando agora. então sim, por enquanto vamos usar +raknet na mesma versão que samp usa, apenas para manter a compatibilidade retroativa. fora isso, por exemplo para NPCs em que josh está trabalhando agora, quer dizer, não agora, mas ele estava trabalhando nisso, ele estava usando enet, essa provavelmente é nossa primeira escolha e é muito melhor que raknet, e recebe contribuições com mais frequência, então não temos problemas com exploits ou coisas que apareçam depois, porque todos sabemos que o projeto raknet está +morto, a versão mais recente provavelmente tem seis anos a esta altura. então essa é a única razão pela qual estamos usando raknet agora, vamos mudar isso. + +**Potassium:** +legal, não entendo nada disso, mas obrigada. então houve muita discussão na +thread sobre sync e c-bug e coisas assim, então acho que as pessoas querem saber como será a sync comparada ao samp + +**JustMichael:** +exatamente igual + +**j0sh...:** +exatamente igual, sim. veremos, mas não podemos fazer isso até o client sair, e provavelmente não vou fazer isso porque isso arruinaria a experiência do samp. + +**Potassium:** +sim, então houve bastante debate sobre isso, e obviamente também há dentro da equipe. + +**JustMichael:** +sim, eu não concordaria com isso porque meu servidor literalmente depende desses bugs + +**Southclaws:** +as pessoas gostam dessas coisas e já existem formas de parar e prevenir de qualquer maneira, então não acho que seja nossa prerrogativa nos envolver nisso + +**JustMichael:** +acho que no client provavelmente deveríamos ter uma forma de desabilitar esse tipo de bug se o dono do servidor quiser, mas deveria ser uma opção + +**Southclaws:** +você pode desabilitar via scripts pawn de qualquer forma + +**JustMichael:** +sim, pode + +**Potassium:** +então o consenso sobre isso, só para esclarecer, é que vamos simplesmente deixar como está e +cada servidor pode escolher o que faz com isso. certo? + +**Southclaws:** +basicamente, sim + +**JustMichael:** +sim, basicamente + +**Southclaws:** +é uma daquelas coisas em que você está ferrado se fizer e ferrado se não fizer, então sim + +**Y_Less:** +de novo, cabe aos servidores. servidores são diferentes, então se quiserem isso, podem ter + +**Southclaws:** +meio como lag comp, algumas pessoas gostam de lag shot, algumas não gostam de lag shot, por isso era uma opção que você podia ligar e desligar + +**Potassium:** +isso mesmo, sim, acho que essa é a melhor forma de lidar com isso. ok, então uma pergunta muito popular tanto no fórum quanto neste chat, que sei que vocês não querem responder, mas vamos lá... samp para android. quais são seus pensamentos sobre isso? + +**JustMichael:** +não vamos dar suporte direto, mas vamos dar as ferramentas para que qualquer outra pessoa +possa fazer + +**Southclaws:** +não queremos dar suporte ao samp mobile existente, porque a versão atual existente +do samp mobile é baseada em código roubado. é muito ilegal. + +**BigETI:** +alguém aqui provavelmente quer usar openmp e então fazer seus próprios clients android + +**Potassium:** +então oficialmente, como desenvolvedores do open multiplayer, NÃO é a resposta? + +**iAmir:** +na verdade há algumas coisas nos bloqueando, por exemplo para implementar nossa própria biblioteca em um arquivo APK precisamos modificá-lo, então isso significa que precisamos modificar o arquivo apk do GTA SA +para android, e isso na verdade tem questões legais. então além disso, precisaríamos +modificar algum código no arquivo apk do gta também, então ou seria java assembly ou +faríamos patch no código atual do gta sa, para que ele carregasse nossa própria biblioteca, que seria o client openmp, então para isso, como eu disse, precisaríamos modificar o jogo. e precisaríamos dar às pessoas a versão modificada, o que não é legal, então teríamos problemas legais depois, problemas de copyright depois. + +**Southclaws:** +tecnicamente poderíamos distribuir legalmente o binário para os jogadores e então deixá-los adicionar ao apk deles + +**Y_Less:** +existem versões roubadas do código-fonte por aí, então é nisso que a versão android +é baseada. se quiséssemos usar isso, poderíamos ter usado, poderíamos ter +começado a partir desse código, atualizado o servidor e escrito openmp usando código roubado, +e teria sido muito ilegal, e essa é inteiramente a razão pela qual começamos openmp do zero, zero código-fonte antigo nele, você pode compará-los e eles não são absolutamente nada parecidos. porque de forma alguma apoiamos roubo. + +**Potassium:** +correto, esse é um ponto muito importante para reiterar, não apoiamos código roubado + +**Y_Less:** +e não há NENHUM neste mod. + +**JustMichael:** +isso potencialmente nos colocaria em uma situação muito ruim com questões legais se fôssemos por esse caminho de qualquer forma + +**Y_Less:** +teria saído anos atrás se fizéssemos isso! + +**Potassium:** +agora em uma linha de perguntas parecida, as pessoas querem saber por que deveriam jogar openmp em vez de mta. então sem insultar outros mods, qual é a diferença? + +**JustMichael:** +bem, ainda estamos oferecendo a mesma experiência samp que todo mundo ama, mas acho que agora estamos oferecendo um caminho de atualização. mais recursos no futuro, um possível caminho para todos meio que seguirem em frente, até adicionar as coisas que todos queriam do samp por anos. muita gente saiu do samp porque o samp tem seguido o mesmo caminho por muito tempo, não foi a lugar nenhum, muito pouco foi adicionado. mas agora estamos dando às pessoas a oportunidade de adicionar o que quiserem agora, depois de lançarmos, elas podem adicionar coisas e esse caminho está aberto agora. + +**Potassium:** +alguém tem mais algo a acrescentar? + +**Southclaws:** +mta é ótimo, eu gosto do mta. mta não é um software ruim, não há treta ali, o map editor é ótimo! eu sempre costumava usá-lo. mas há uma diferença cultural entre mta e samp, e não acho que alguém realmente conseguiu descobrir exatamente qual é. mta definitivamente tem recursos melhores, é uma coisa objetivamente melhor que samp, mas as pessoas meio que gostam mais do samp, acho que ele fica mais próximo do jogo. + +**JustMichael:** +eles têm objetivos diferentes + +**Southclaws:** +sim, objetivos diferentes, mta meio que parece mais garry's mod de certa forma. é mais um tipo sandbox de crie seu próprio jogo multiplayer maluco + +**Hual:** +as pessoas gostam de simplicidade + +**Southclaws:** +e a capacidade de entrar no servidor sem baixar 500 megabytes de skins de anime é sempre uma coisa boa! + +**Y_Less:** +acho que samp e mta atendem mercados ligeiramente diferentes, por que você usaria este em vez de mta é o mesmo motivo pelo qual usaria samp em vez de mta - é essencialmente samp. + +**Potassium:** +o próximo grupo de perguntas é mais sobre a estrutura do mod e da comunidade do que sobre scripting. então as pessoas gostariam de saber se ele será compatível com a versão steam de san andreas porque obviamente, como sabemos, samp não é. + +**Hual:** +deveria ser. + +**Southclaws:** +sim, mta faz isso, tenho certeza de que podemos fazer + +**j0sh...:** +só vai dar bastante trabalho. + +**Y_Less:** +não há razão para não fazer. + +**Southclaws:** +mas se não, existem downgraders de qualquer forma, e existem downgraders há anos. então de qualquer forma não acho que seja um grande problema. + +**Y_Less:** +não, mas deveríamos conseguir, realmente não há razão para não + +**Potassium:** +bem, isso é empolgante! +ok, agora a master list. as pessoas querem saber o que vai acontecer com ela, se teremos uma +lista paga etc. etc. - a lista de servidores + +**JustMichael:** +temos algumas ideias para ela, mas não tenho certeza, ainda não chegamos ao ponto em que dissemos "ok, é isso que vamos fazer" + +**Southclaws:** +quero reiterar que este não é um projeto com fins lucrativos de forma alguma. houve ideias jogadas por aí, porque as pessoas realmente querem uma forma de... sabe, se elas administram um grande servidor e ele é meio como um negócio, então querem uma forma de meio que impulsioná-lo para o topo como uma espécie de investimento, e eu entendo isso e na verdade falei com várias pessoas sobre esse desejo da comunidade de servidores maiores, existem ideias e não acho que estamos prontos para discutir todas elas ainda porque não estão realmente detalhadas. mas tenho trabalhado no novo índice de servidores que está sendo implantado agora. ele basicamente será como samp-servers.net, mas com um backend atualizado, e dará suporte a servidores samp e no futuro a servidores openmp, e será meio como o quadro de anúncios do fórum, mas melhor porque não está em um fórum, mas sim será um site dedicado e será openmp servers ou algo assim, e isso virá em breve. a primeira versão está meio pronta, e também será open source, então você meio que acompanha o desenvolvimento disso e eventualmente isso se transformará na lista. como eu disse, estamos bem no início de decisões assim, e eu realmente não sei qual é o consenso da equipe, mas acho que provavelmente não vamos dividir servidores em duas listas separadas porque isso meio que separa as pessoas entre os ruins e os bons, de certa forma, e meio que cria nós contra eles... não um conflito, mas tipo, sabe, é meio como uma separação + +**Y_Less:** +uma divisão + +**Southclaws:** +e acho que dar aos servidores menores uma chance de conseguir alguma visibilidade também é bom, porque às vezes as pessoas fazem um projeto muito legal e talvez não consigam pagar para entrar na hosted list ou algo assim, então um dos meus objetivos nisso é meio que destacar servidores potencialmente interessantes que não têm alcance. mas no momento será apenas uma lista e você poderá ordená-la por qualquer coisa que quiser e encontrar servidores. essa será a primeira versão. + +**JustMichael:** +sim, o samp no momento é muito enviesado pela hosted tab + +**Southclaws:** +sim, e é limitada e cara + +**BigETI:** +sim, e é um nome horrível + +**iAmir:** +para nossa própria lista de servidores podemos realmente adicionar algumas opções como avaliações, votação e coisas assim, então pode haver duas seções, por exemplo, uh, uma poderia ser a dos que têm mais avaliações, e a outra poderia ser, por exemplo, um servidor que foi avaliado frequentemente nos últimos dias, então podemos realmente ver as tendências e coisas assim. então novos servidores podem subir e ser vistos por outros jogadores. isso é na verdade uma boa forma para novos servidores que realmente têm uma ideia única poderem ser vistos por outros jogadores e ficarem famosos, é na verdade uma forma melhor do que gastar dinheiro em outras listas ou coisas assim. + +**Potassium:** +então acho que a coisa realmente importante a tirar disso é que somos um projeto sem fins lucrativos, então não vamos criar uma lista de servidores puramente com a intenção de ganhar dinheiro com ela. + +**Y_Less:** +mas isso não significa que não haverá formas de anunciar. e se você tiver ideias sobre isso, poste nos fóruns! + +**Potassium:** +sim, e isso é https://forum.open.mp - cadastrem-se! + +**Y_Less:** +isso é algo que discutimos por tipo dois anos e não temos conclusão + +**Potassium:** +ok, alguém perguntou: o servidor openmp realmente inclui algum tipo de melhoria de desempenho em comparação com o servidor samp? acho que meio que respondemos isso antes na pergunta sobre mta, mas se alguém tiver mais algo a acrescentar... + +**Hual:** +sim, posso só dizer que eu realmente rodei ele em um raspberry pi zero, então sim + +**iAmir:** +sim, você pode hospedar seu próprio servidor enquanto caminha pela rua, tem seu raspberry pi no bolso e ainda está rodando seu servidor samp, então sim, deve ser rápido para isso ser possível + +**JustMichael:** +devemos mencionar que porque estamos usando C++17 há tipo um deployment mínimo para isso, certo? + +**Hual:** +o que você quer dizer? + +**Y_Less:** +não? depende de como você faz o build + +**JustMichael:** +quero dizer requisitos de biblioteca, como bibliotecas do sistema operacional e coisas assim + +**Southclaws:** +Glibc e coisas assim + +**BigETI:** +isso não deve ser um problema + +**Y_Less:** +sim, não há razão para você não poder fazer build para um sistema diferente + +**JustMichael:** +sim, você provavelmente está certo, eu estava pensando em edge cases como ark e coisas assim, mas provavelmente vai funcionar de qualquer forma... espera, alguém não fez build para ark já? ah, talvez tenha sido você Hual? talvez tenha sido você fazendo isso para mim? + +**Southclaws:** +ah, você quer dizer arm? + +**JustMichael:** +desculpa, sim, eu disse ark, não disse? + +**Hual:** +então sim, desempenho está ok, compatibilidade está ok + +**Potassium:** +agora a pergunta que todo mundo odeia... 0.3 DL. muita gente, muitos donos de servidores perguntaram se +será compatível no primeiro lançamento para poderem trocar seus servidores imediatamente. + +**everyone:** +sim + +**BigETI:** +essa foi fácil + +**Potassium:** +essa FOI fácil porque da última vez que conversamos sobre isso tivemos opiniões muito divididas e meio que perguntamos à comunidade quais eram as opiniões dela, + +**JustMichael:** +sim, bem, já sabemos que é possível porque adrian graber escreveu aquele plugin que literalmente engana o client para conectar, então sabemos que podemos fazer + +**Potassium:** +e então, em uma linha parecida, sei que ainda não estamos aceitando perguntas ao vivo, mas alguém no chat fez uma pergunta muito boa: vocês pensaram em fazer uma workshop para openmp, algo como o mta tem para mapas, scripts, plugins etc? + +**Southclaws:** +uh, isso seria muito legal! + +**JustMichael:** +sim, isso seria legal! + +**Y_Less:** +a pergunta é se pensamos nisso? a resposta é não. mas agora vamos pensar! + +**Potassium:** +então obrigada! seguindo, as pessoas queriam saber mais sobre planos futuros. então uma pergunta específica foi "qual é o próximo passo para o openmp depois que ele atingir o fluxo do samp" - então uma vez que tenhamos levado ele à compatibilidade e aonde queremos que esteja, quais são seus planos e ideias futuras? + +**JustMichael:** +acho que depois do lançamento vamos apenas tentar começar com o client, seguir para o segundo lançamento, eu acho. não pensamos muito sobre isso. + +**Hual:** +provavelmente deveríamos arrumar o servidor primeiro + +**JustMichael:** +provavelmente teremos um período depois do lançamento em que esperamos por relatórios de bugs +e coisas assim e lidamos com isso, porque em qualquer software sempre haverá aqueles edge cases que precisam ser resolvidos, e nenhum software que sai de primeira +vai ser perfeito. + +**Potassium:** +então é justo dizer que o lançamento inicial, e por algum tempo depois, não verá realmente nenhum recurso novo, eles virão mais tarde no futuro talvez? + +**JustMichael:** +ah sim, provavelmente não imediatamente + +**j0sh:** +somos basicamente limitados pelo client, então sem nosso próprio client não podemos fazer muita coisa + +**Y_Less:** +podemos fazer algumas coisas inteligentes, temos alguns truques na manga + +**Potassium:** +fiquem de olho, basicamente! + +**BigETI:** +mas a maioria deles já foi feita de uma forma ou de outra + +**Potassium:** +bem, acho que sempre há algo novo. nessa nota, que tipo de coisas vocês gostariam de eventualmente adicionar quando tudo estiver compatível, os bugs resolvidos e tudo mais, coisas novas que vocês gostariam de ver? + +**Southclaws:** +animações de sexo. + +**Potassium:** +meu deus. + +*todo mundo ri* + +**j0sh...:** +Eu quero unicode. Quero o emoji de palhaço no chat. + +**Potassium:** +ah sim, emojis no chat!!! + +**Southclaws:** +a capacidade de russos falarem com ingleses no mesmo servidor sem precisar mudar a code page + +**JustMichael:** +sim, isso seria legal + +**Southclaws:** +isso seria ótimo + +**j0sh...:** +isso é revolucionário + +**Potassium:** +isso é revolucionário! + +**Southclaws:** +clustering multi-servidor seria legal, há muitos servidores russos por aí que rodam tipo 20 servidores e estão todos conectados, e você pode imaginar que é bem gambiarra no backend. acho que facilitar isso seria meio interessante, poder trocar de servidor dentro do jogo e coisas assim. + +**Potassium:** +alguém no chat acabou de perguntar: voice chat no openmp? + +*todo mundo ri* + +**Southclaws:** +você quer crianças de 12 anos gritando com você pela rua? acho que não. existem plugins por aí, e claro com o client e o servidor lançados no futuro, se você quiser fazer plugins de voice chat então vá em frente! + +**JustMichael:** +já existem vários por aí, acho que conheço dois + +**Southclaws:** +acho que eles são closed source, então é meio suspeito + +**JustMichael:** +não, acho que um deles é open source + +**Y_Less:** +tem um que é realmente open source + +**Southclaws:** +bem, aí está, essa é a solução. acho que uma coisa que quero dizer, porém, é que só porque estamos fazendo uma nova plataforma de mod multiplayer do zero para construir em cima, isso não significa que o próprio mod em si precisa ter todos os recursos possíveis enfiados +nele. estamos fazendo uma API de plugins melhor por um motivo, recebemos perguntas como vocês vão adicionar mysql ou vão adicionar sscanf, ou vão adicionar este plugin àquele plugin, e a resposta para a maioria dessas perguntas é não, porque não há razão para isso. na verdade há mais razão para construir mais coisas como plugins porque aí são modulares, você pode adicioná-las e removê-las quando não precisar delas. então acho que o mesmo vale para coisas como +voice chat e coisas de client. vamos fornecer um conjunto melhor de ferramentas para as pessoas realmente aumentarem a experiência e adicionarem coisas novas a ela, e acho que isso é melhor do que encher +com recursos que talvez a maioria das pessoas nem use. + +**Hual:** +sim, mas também como instalar plugins no samp é meio chato, provavelmente deveríamos pensar em ter um registro oficial de plugins onde servidores possam especificar quais plugins de client os clients baixam + +**Southclaws:** +sim, tipo uma versão client do sampctl, eu suponho. e claro a preocupação aí é sempre poder executar código arbitrário no computador de um usuário, então sabe, acho que ter um repositório seria meio bom + +**Y_Less:** +só algo para ter em mente, metade dos grandes plugins que todo mundo usa, como mysql, streamers, sscanf, tudo isso, os desenvolvedores desses plugins estão NESTA EQUIPE! não vamos simplesmente parar de desenvolvê-los e dizer que você não pode pegar meu plugin agora porque eu escrevi +outra coisa. + +**Potassium:** +então podemos só esclarecer para algumas pessoas perguntando no chat sobre fazer um client. então isso +é um plano futuro, certo? fazer nosso próprio client? + +**everyone:** +sim, essa é a segunda versão + +**Southclaws:** +essa é a parte divertida + +**Potassium:** +as pessoas estavam perguntando sobre outras comunidades que falam línguas diferentes e tal, e meio que querem saber o que estamos fazendo para trabalhar com essas comunidades e como planejamos espalhar a palavra para essas comunidades. acho que é justo dizer que estamos trabalhando nisso, estamos recrutando voluntários, eu acho, para traduzir nossas páginas da wiki e qualquer outra coisa para outros idiomas, para moderar seções de idioma no fórum, https://forum.open.mp aliás, e geralmente apenas para serem o ponto de contato entre nossa equipe e as outras comunidades, eu acho + +**JustMichael:** +já fizemos um grande esforço para traduzir a wiki, então estamos fazendo uma melhoria para +tornar mais fácil para essas comunidades se combinarem com a comunidade maior. eu mesmo +já conversei com várias porque conheço muitos servidores da região dos balcãs, eu +na verdade administro um mesmo sem falar a língua, mas aí está. na verdade administro um segundo agora, e um servidor role play, então estive em contato com várias áreas deles e tentei trazer alguns deles, e muitos estão a bordo, muitos donos de servidores dessas áreas estão a bordo, então isso é sempre bom + +**Southclaws:** +fiquei surpreso ao saber que há uma comunidade chinesa, japonesa e taiwanesa bem grande também, que eu nem sabia que existia, então tenho conversado com pessoas dessas comunidades +e ajudado a traduzir e tal. + +**Y_Less:** +descobri que havia uma grande comunidade chinesa e japonesa há cerca de sete segundos, quando você disse isso + +**Southclaws:** +já mencionei isso antes no discord, mas sim, existe de fato uma comunidade grande, o problema sempre foi a barreira linguística, mas as coisas de tradução estão realmente ajudando com isso, o fato de você poder realmente fazer, porque na wiki antiga você não conseguia criar uma +conta por muitos anos por algum motivo, então ninguém conseguia traduzir a wiki + +**Y_Less:** +o motivo é kalcor + +**Southclaws:** +então as pessoas geralmente fazem suas próprias wikis e coisas assim e elas ficam desatualizadas e sim, problemas e problemas. ouvi dizer aparentemente que na tailândia existe na verdade uma única versão traduzida do game mode godfather que todo mundo copia e usa + +**Y_Less:** +já existem várias seções de idioma no discord e nos fóruns. o grande problema que tivemos, porque os fóruns do samp costumavam ter seções de idioma também, o problema +era moderá-las porque se não falamos a língua não sabemos o que vocês estão dizendo. se há problemas, as pessoas fazem denúncias tipo ah, essa pessoa está fazendo algo ruim. +bem, não sabemos, não podemos realmente revisar isso, então adoraríamos entrar em contato com comunidades, +meio que precisamos de pessoas dentro dessas comunidades que falem inglês para fazer a ponte, mas estamos muito interessados em encontrar essas pessoas que estão envolvidas em uma das comunidades de língua +estrangeira e falam inglês, por favor falem conosco! + +**Potassium:** +sim, então se vocês conhecem membros confiáveis da comunidade que falam outros idiomas e querem nos ajudar, digam a eles para entrar em contato conosco no nosso fórum, nosso discord, onde for, hum, porque adoraríamos isso + +**Y_Less:** +quer dizer, já temos várias línguas na equipe, falamos inglês ou alemão ou +persa ou... + +**Potassium:** +australiano + +**Y_Less:** +é basicamente isso, sim, australiano, essa é uma língua única... yorkshire... + +**Hual:** +também estamos bem próximos das comunidades turca e romena, +elas são bem grandes + +**Y_Less:** +e também tenho contatos na comunidade russa. + +**Potassium:** +então estamos tentando. + +**Y_Less:** +é complicado, é difícil, por isso não funcionou antes. + +**Potassium:** +sim, e falta de esforço. então a última pergunta meio pré-carregada do fórum hoje +é: o que vocês mais esperam do openmp? e eu achei isso +muito fofo. + +**everyone:** +o lançamento. + +**Potassium:** +depois do lançamento, só em geral. é uma pergunta legal porque fico feliz que as pessoas consigam ver que estamos felizes por fazer isso e animados por fazer. então sim, pelo que vocês estão ansiosos? + +**JustMichael:** +só estou ansioso para chegar a um estado em que ou os jogadores estejam finalmente aproveitando os +recursos, ou cheguemos a um ponto em que o resto da comunidade possa assumir, basicamente isso para ser honesto + +**Potassium:** +mais alguém quer acrescentar algo? + +**j0sh...:** +sem relatórios de bugs + +**Potassium:** +eu honestamente estou meio ansiosa para reunir a comunidade de novo +porque todos nós meio que nos separamos e seguimos caminhos diferentes + +**JustMichael:** +seria legal ter um grande aumento de jogadores, especialmente agora que conversamos +sobre incluir as outras comunidades que seguiram seus próprios caminhos, seria +legal tê-las então, porque sim, sabe, mais jogadores é melhor + +**Potassium:** +nem só contagem de jogadores, só em geral, reunir a comunidade de volta + +**Y_Less:** +sim, não estamos fazendo isso por causa de um jogo de 15 anos porque o jogo é o melhor jogo de todos, estamos fazendo por causa da comunidade + +**Potassium:** +sim, isso mesmo + +**Southclaws:** +NO ENTANTO, ele É o melhor jogo de todos! + +**JustMichael:** +posso confirmar! + +**Y_Less:** +uhhhh vice city é melhor. + +**Potassium:** +liberty city é meu lar, eu sempre vou amar gta 3. + +**JustMichael:** +então a equipe está completamente dividida + +**Potassium:** +sim. mas nessa nota, recebemos muitas perguntas do tipo san andreas é um jogo tão antigo, por que vocês se importam, por que vocês ligam, esse tipo de coisa. e eu só quero responder +essa, ou começar respondendo essa, e dizer que acho importante lembrar que uma grande parte da base de jogadores do samp vem de países onde a tecnologia não é necessariamente tão atualizada ou tão prioritária quanto é onde alguns de nós vivem, e muitos dos nossos jogadores jogam samp porque é um dos únicos jogos que rodam nos pcs deles ou que eles podem pagar, então não sei, eu simplesmente amo muito o fato de podermos dar a eles a capacidade de jogar e criar seus próprios game modes como battle royales ou modos de corrida ou qualquer coisa, +para que todos ainda possam experimentar esse tipo de jogo mesmo que não possam pagar por pubg ou call of duty ou, sabe, não consigam rodar essas coisas + +**Southclaws:** +uma coisa secundária para acrescentar a isso, acho, é o lado de scripting, é como uma droga de entrada de certa forma, é uma porta de entrada para as pessoas aprenderem a programar, e se você aprende a programar isso pode ser ótimo porque você pode fazer coisas e jogos e se divertir, mas também pode conseguir um emprego fazendo isso + +**Potassium:** +há MUITAS pessoas- + +**Southclaws:** +muita gente aqui realmente conseguiu empregos por causa do samp, eu sou um deles. é definitivamente uma +ótima porta de entrada para aprender a programar porque pawn é uma linguagem bem simples, e então você pode passar para C++ para construir plugins e essa é meio que uma linguagem mais complexa, e então pode passar a fazer coisas web como php e javascript por causa de painéis de +controle de usuários e fóruns e tal, e só se expande a partir daí, e essa é uma das principais coisas que eu amo nisso, eu realmente não jogo mais e não escrevo muito código há alguns anos, mas eu simplesmente amo a comunidade, amo ajudar as pessoas com esse lado das coisas, então é por isso que estou nisso + +**Y_Less:** +acho que você pode rastrear a história dos jogos dos últimos 15 anos através dos modos do samp. +qualquer que seja o jogo popular do momento, há uma versão samp dele + +**Potassium:** +sim, absolutamente, e eu amo isso! + +**Y_Less:** +pubg - samp. battle royale - samp. microsoft flight simulator samp. + +**iAmir:** +among us... + +**Southclaws:** +sempre quis escrever um game mode estilo Trouble in Terrorist Town... talvez essa seja nossa próxima stream, fazer um gamemode TTT. + +**Potassium:** +mas sim, só voltando a essa nota, não acho que existam muitos jogos ou comunidades onde você possa fazer esse tipo de coisa, onde você possa ter modos diferentes, talvez roblox... + +**Southclaws:** +garry's mod é tipo a coisa mais próxima, e mesmo assim você precisa de um pc semi-moderno para realmente rodar, e quando entra no servidor geralmente baixa 500 megabytes de skins de anime + +**Potassium:** +toda vez que jogo garry's mod tenho erros de textura e coisas assim, e tenho um pc bom. então enfim, acho que vamos seguir em frente e pegar algumas perguntas ao vivo do chat, então vocês que estão ouvindo... + +**Y_Less:** +só rapidamente antes de você fazer isso, outra coisa relacionada a esse ponto de que estávamos dizendo que muitas pessoas começaram no samp aprendendo a programar com pawn, é uma linguagem bem simples, e muita gente sempre pergunta por que usamos pawn quando é uma linguagem tão simples... e essa é a resposta, usamos porque é uma linguagem simples, qualquer pessoa consegue pegar. é um jogo 18+, mas sejamos honestos, temos muitas crianças jogando, elas chegam e dizem ok, quero fazer meu próprio servidor, como faço isso? bem, primeiro você precisa baixar este editor e estes plugins, e então baixa este outro compilador e estas outras coisas e faz isso e isso e isso, e então isso e então isso e isso, e +então você pode começar a escrever seu primeiro código nesta linguagem horrivelmente conflituosa. elas simplesmente ficam +ah... enquanto com samp era como começo a programar? abre isto, pronto. + +**Southclaws:** +e você já tem um pedaço de código para começar também. + +**Y_Less:** +a barreira de entrada é zero + +**Potassium:** +colocando assim, se eu consigo fazer, qualquer um consegue. e isso não é um exagero! + +**Southclaws:** +Potassium aprende a programar - a série de vídeos. quando isso vai acontecer? + +**Potassium:** +sim, eu topo muito isso! mas vocês vão ficar muito bravos. + +**Y_Less:** +na verdade acho que seria uma série realmente boa. + +**Potassium:** +sou muito difícil de ensinar, e também vou chorar. mas tudo bem, acho que isso é bom conteúdo! enfim, vamos pegar algumas perguntas ao vivo do chat, então se vocês no chat têm alguma pergunta, que eu sei que têm... + +**JustMichael:** +alguém acabou de perguntar sobre GetAsyncKeyState + +**iAmir:** +não tenho certeza se ter isso é realmente uma boa ideia, porque o que o samp faz agora é escutar eventos de teclas, então o que o player mapeou para o próprio jogo gta, então por exemplo quando você pressiona F, se você mudar o botão F para sei lá G, por exemplo, para entrar em veículos, quando eles pressionarem G, isso será chamado no lado do servidor, então o que eles querem e o que estavam perguntando é na verdade enviar todas as teclas, todos os eventos de tecla para o servidor, o que na verdade não é uma boa ideia porque você pode realmente rodar um keylogger ou coisas assim, e vai ter alguns problemas de segurança + +**Southclaws:** +isso também prova que o layout de teclas fica então controlado pelo servidor e não pelo jogador, e isso é meio estranho porque se você gosta de usar um layout de teclado diferente, talvez você goste de usar ESDF, que sei que alguns jogadores de fps realmente usam coisas assim e outros layouts para WASD, se você entra em um servidor e de repente todos os seus botões ficam meio diferentes, então +pode ser meio confuso. então quer dizer, poderíamos adicionar mais teclas que possam ser rebindeadas, mas +acho que usar as teclas do jogo realmente dá aos jogadores a capacidade de personalizar seu tipo de +layout e coisas assim para combinar com eles, não o servidor forçando eles a pressionar F se quiserem usar E para entrar em carros ou algo assim, pegar itens, coisas assim + +**iAmir:** +acho que como deveríamos lidar com isso é adicionar algumas ações, não teclas, só um monte de ações para que qualquer um possa bindar qualquer coisa a elas + +**Southclaws:** +temos Y e N também que foram adicionados em algum momento, foi H? não lembro, houve algumas teclas novas adicionadas em algum momento. poderíamos fazer coisas assim, havia uma tecla que eu uso... tab é na verdade uma ação de tecla, mas também é o scoreboard, então os usuários não conseguem realmente usá-la, mas se você rebinda tab para algo como R, de repente você tem uma nova tecla para +realmente rebindeá-la no lado do servidor. então há potencial ali. + +**Y_Less:** +sim, uma forma melhor é simplesmente fazer o servidor definir ações e então o client pode pegar essa +lista de ações e apenas atribuir suas próprias teclas, mas ainda assim é só que eles acionaram esta ação, pressionaram esta tecla. + +**Southclaws:** +sim, e também não permitir que as pessoas bindem todas as teclas do teclado e então façam keylog das pessoas. + +**Y_Less:** +não vai funcionar porque se eles puderem bindar as próprias teclas, podem mudar, então o keylogger é inútil, mas eles acionaram estas ações nesta ordem, que tecla é essa? não sei + +**JustMichael:** +não tenho certeza se isso é uma pergunta direta para nós, mas só diz qual é a quantidade recomendada de rams dedicadas + +*todo mundo ri* + +**Potassium:** +esse é o jamie + +**JustMichael:** +troll maldito + +**Southclaws:** +foi trollado, mano + +**iAmir:** +então listei algumas perguntas, uma delas era sobre ddos e pessoas atacando outros servidores, o que é muito comum na comunidade espanhola + +**Potassium:** +todas as comunidades + +**iAmir:** +sim, meio que todas as comunidades, mas na comunidade espanhola há um cara, coisas assim + +**Southclaws:** +ah sim, Graber teve que escrever uma coisa estranha de proxy + +**iAmir:** +sim, e as pessoas agora estão perguntando sobre isso, para proteção contra ddos + +**JustMichael:** +não há nada que possamos fazer sobre ddos em si + +**Southclaws:** +a coisa que Graber escreveu e algo em que eu trabalhei, e na verdade você +trabalhou nisso, michael, é um proxy, que é meio estranho de fazer funcionar por causa +de como o samp entre aspas "criptografa" dados, ele usa as portas como uma cifra muito simples, mas se você puder colocar um proxy em outro servidor e então usar round robin dns ou algo assim, isso pode ser uma boa técnica de mitigação, então acho que fornecer as ferramentas para fazer isso seria uma coisa boa + +**JustMichael:** +haveria um problema, porém, se alguém fizesse ddos no próprio load balancer ou proxy, então isso arruinaria tudo para todos os servidores + +**Southclaws:** +sim, mas um proxy load balancer é muito mais leve que o servidor do jogo, então você pode dedicar múltiplas threads para realmente lidar com essa carga, é meio como cloudflare e todos esses serviços de proxy funcionam, então sabe, se você é um servidor grande e tem orçamento, então pode +sabe, alugar um monte de vps, round robin e dns e colocar proxies em todos eles, e então isso meio que absorve a carga e seu servidor real de verdade você pode simplesmente esconder um pouco o endereço ip e ninguém consegue fazer ddos nele diretamente + +**iAmir:** +o resultado da nossa discussão é que se eles estão realmente mirando no servidor em si, não no servidor openmp, por exemplo a máquina em si, se estão mirando nisso com +um stressor ou algum tipo de exploits, coisas assim, você não pode realmente fazer nada sobre isso. podemos corrigir nosso trabalho, mas não podemos corrigir detalhes porque é assim que a internet funciona. se esses são exploits ou stressor ou algum tipo de ferramentas de ddos, coisas assim, se estão +realmente mirando no servidor openmp, podemos encontrar o problema e corrigi-lo o mais rápido possível quando +descobrirmos, mas sobre o servidor em si, a máquina, realmente não há como lidarmos com isso porque não há nada para consertarmos, então isso é realmente trabalho de outras pessoas, comprar proteção contra ddos, ter bons servidores, pagar mais + +**JustMichael:** +isso vem com qualquer pessoa rodando qualquer tipo de aplicação em produção, qualquer tipo de servidor, não é um problema específico nosso + +**iAmir:** +sim, até um site simples, as pessoas podem mirar em um site para derrubar os servidores + +**Southclaws:** +elas podem mirar no seu roteador de casa + +**Y_Less:** +você simplesmente não consegue parar ddos em software, não é possível, eles continuam dizendo como podemos parar ddos, compre proteção contra ddos, é isso. + +**Hual:** +basicamente podemos parar se estiver abusando de um exploit do openmp, caso contrário não há nada que possamos fazer. + +**JustMichael:** +também seria bom se tivéssemos a comunidade reportando isso para garantir que elas realmente reportem esses problemas imediatamente quando os encontrarem, porque isso nos ajudaria +a corrigi-los se algo acontecer + +**iAmir:** +sim, um dos maiores problemas que tivemos no samp foi que as pessoas não conseguiam reportar bugs, havia tipo alguma thread ou discussões e coisas assim e as pessoas reportavam bugs ou adicionavam sugestões e essas mensagens se perdiam em um dia. + +**JustMichael:** +lembro que havia uma thread de bugs que foi deletada tipo três horas depois de ser criada, quando tinha acho que umas 27 ou 30 respostas diferentes nela, todas bugs, e ela simplesmente sumiu + +**Southclaws:** +encontrei um bug onde você podia ler logs remotamente e ninguém se importou com isso e não recebi resposta + +**Potassium:** +não entendo esta pergunta, mas Southclaws: me mandou, então diz: samp não suporta ip failover/alias - openmp vai suportar? + +**Southclaws:** +a razão pela qual samp não suporta isso é porque ele usa a porta e o endereço reais para criptografar seus pacotes, mas você pode simplesmente não fazer isso quando o client sair. enquanto tivermos que usar o servidor samp, estaremos meio presos à criptografia estranha que existe, mas depois disso podemos fazer tipo uma coisa normal de proxy udp. e sim, você também pode fazer failover +para dns. + +**iAmir:** +uh, também há outra pergunta que tenho na minha lista que as pessoas perguntaram no chat, alguém perguntou mais como uma sugestão, podemos considerar dar aos servidores a capacidade de adicionar seu favicon, que é mostrado no client ao lado do título do servidor, por exemplo no launcher. poderíamos fazer isso agora mesmo tendo até algum client ou algum launcher, quero dizer, +sim, com um launcher customizado podemos realmente adicionar uma rule customizada à query e então lemos isso no nosso próprio launcher + +**Southclaws:** +tem o servers.net que escrevi três anos atrás ou dois anos atrás ou algo assim, não lembro, acho que ele realmente tinha suporte para um campo chamado "banner", que deveria ser uma imagem que seria tipo um gráfico que você poderia colocar no fundo da página do seu servidor ou da lista de servidores ou algo assim + +**JustMichael:** +também há o fato de que agora que temos o indexer você adicionou suporte a login para usuários, então eles poderiam facilmente, mesmo sem isso estar no servidor, tecnicamente só fazer login nele e colocar no index e então sim, todos os launchers poderiam simplesmente ir pelo indexer + +**Southclaws:** +o plano com o indexer é basicamente lançar um servidor, você faz login no indexer e o indexer vai te dar um token, tipo um api token, e você coloca esse token no arquivo de configuração do seu servidor e agora o indexer verificou que você é dono daquele servidor, então na interface web do indexer você pode ir e editar a descrição, o ícone, a imagem, qualquer coisa que acabarmos adicionando, gifs, não sei. então você não precisa modificar um arquivo de configuração que está em uma vps, fazer login e upload por ssh, qualquer coisa, você só vai a um site e pode editar com seu navegador e é muito mais simples. + +**Potassium:** +certo, antes de encerrarmos por hoje, as pessoas continuam pedindo para mostrarmos vídeos do progresso. então +não temos isso, não temos vídeos porque não há realmente nada para mostrar no +momento, certo? + +**JustMichael:** +temos feito live streams recentemente e mostrado progresso do openmp + +**iAmir:** +não há realmente nada para mostrar em uma stream ou como vídeo porque é apenas uma aplicação de servidor simples, que é como um console + +**Hual:** +o desenvolvimento é ocasionalmente transmitido no discord + +**Potassium:** +então se vocês entrarem no nosso servidor discord, Southclaws: e outras pessoas frequentemente transmitem o desenvolvimento e coisas assim, o progresso deles, no discord, então você meio que entra no canal do discord e assiste à stream e pode entrar na conversa também, conversar e fazer perguntas. somos bastante abertos com isso e fazemos muita coisa pública em que vocês podem participar. + +**JustMichael:** +alguém acabou de perguntar sobre servidores com custom ui usando htmlcs e js. e nós +falamos muito sobre isso e CEF não fará parte. +hum google adsense hum fontes de +besteira na sua tela sim também bonito +então você tem que trabalhar no xp ah sim sim +sim, também cef não é pequeno +sim teclado sim +vai haver um problema com pessoas +que têm computadores low end +pessoas que têm tipo computadores fracos para +jogar +esse jogo, então se você quiser +saber, pode simplesmente jogar mta +tudo bem, tipo não vamos julgar +quero dizer, eventualmente acho que vamos +ter hum api c +client-side também, certo, então se realmente adicionarmos +isso +e tendo isso, sim josh, quero dizer +não conversamos sobre isso, sim, mas +realmente ter isso é uma boa ideia porque +uh as pessoas podem adicionar voice chat por +conta própria interagindo +com nossa própria api e hum +para coisas como cef, elas podem editar +por conta própria +se adicionarmos api c +então sim, provavelmente é possível +para usuários depois +bem, provavelmente nunca teremos cef +sim, não vamos ter isso embutido, não oficialmente +outra pessoa poderia editar isso não oficialmente +sim +sim, mas não tenho certeza se aceitaríamos isso no +registro de plugins oficiais também, então +não sei, sim, há coisas +alguém perguntou se temos um mapa oficial e editor de modelos +uh sim, temos um amir trabalhando em um visualizador +de modelos +uh não tenho certeza +sim, legal +certo, uh e realmente não +discutimos isso então +poderíamos dizer ah gostaríamos de um, o que +é verdade, mas não há planos de fazer um +porque já existem alguns e eles +funcionam e são ok e todo mundo +conhece + +**Potassium:** +acho que vamos encerrar por aqui porque acho que respondemos muitas perguntas, mas sabe, se você tiver mais perguntas, por favor vá ao nosso fórum ou ao nosso discord e pergunte lá, porque queremos respondê-las. + +**Y_Less:** +algumas pessoas estão preocupadas por não serem falantes nativos e não entenderem o que conversamos, então vamos tentar escrever tudo + +**Potassium:** +sim, vou tentar colocar uma transcrição no ar e então nossos contatos incríveis em outras comunidades podem traduzir para nós, isso seria ótimo + +**BigETI:** +quero dizer, se você enviar para o youtube, isso deve ser relativamente fácil + +**Potassium:** +sim, esse é o plano, vamos colocar isso no youtube, e vou tentar colocar em alguma +plataforma de podcast também para que as pessoas possam ouvir + +**Southclaws:** +tenho certeza de que o youtube também vai gerar algumas legendas muito hilárias + +**Potassium:** +então, como dissemos, pretendemos fazer streams regularmente de agora em diante, não só sessões de q&a, mas +gostaríamos de transmitir o progresso do desenvolvimento, acho que conversamos sobre fazer alguns jogos comunitários, tipo coisas como among us e outros jogos que poderíamos jogar todos juntos, então sigam este canal, entrem no nosso discord, inscrevam-se no youtube, sigam nosso twitter, +facebook, instagram, cadastrem-se no nosso fórum, todas essas coisas boas, tudo está linkado + +**iAmir:** +você esqueceu vk + +**Potassium:** +sim, vk + +**Southclaws:** +também tem um reddit + +**Potassium:** +tudo deve estar linkado abaixo, senão temos um linktree, acredito que é linktr.ee/openmultiplayer, tudo está linkado lá, mas sim, acho que obrigada a vocês pelo tempo, obrigada a todos os espectadores por assistirem, ou melhor, ouvirem, o link do link tree está no chat da twitch agora, uh uma pergunta rápida a mais, há planos de abrir um patreon para pessoas que querem apoiar o projeto? + +**everyone:** +não discutimos realmente nada assim +doações são sempre boas, mas não precisamos muito delas agora +sim, no momento não precisamos delas +acho que sim, quero dizer, coisas como os custos do servidor e qualquer coisa seriam legais +são bem baratos +o indexer provavelmente custa tipo cinco dólares por mês, é quase nada +sim, sim, e os sites são todos hospedados de graça +sim, talvez talvez no futuro abramos algum tipo de forma para vocês +apoiarem o projeto se quiserem, mas sabe, não estamos fazendo isso para ganhar dinheiro, então isso é algo que discutiremos +também é meio como se você estivesse se comprometendo ainda mais e não acho que podemos simplesmente fazer isso +porque todos trabalhamos para viver + +**Potassium:** +certo, bem, muito obrigada a vocês por estarem aqui e por responderem todas essas perguntas, +e obrigada ao chat da twitch por estar aqui, seguir e tudo mais, vemos vocês no discord + +**everyone:** +obrigado por nos receber + +**Potassium:** +de nada, até mais pessoal! diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-07-16-10k-members.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-07-16-10k-members.md new file mode 100644 index 00000000000..eb07c7920f9 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-07-16-10k-members.md @@ -0,0 +1,41 @@ +--- +slug: 10k-members +title: 10.000 membros! +authors: potassium +--- + +Acabamos de atingir uma marca incrível: 10.000 usuários no nosso Discord! 🎉 Já faz um tempo, então aqui vai uma atualização rápida sobre o que vem acontecendo e o que vem a seguir para o open.mp. + + + +Olá, pessoal! + +Recentemente atingimos uma marca incrível: chegamos oficialmente a 10.000 USUÁRIOS no nosso Discord! 🥳🔟🥳 + +Pensamos em aproveitar esta oportunidade para dar uma pequena atualização, já que sabemos que faz um tempo e todo mundo está se perguntando o que está acontecendo! + +Como toda a equipe de desenvolvimento tem empregos em tempo integral e outros compromissos, a situação da COVID realmente atrapalhou todos nós. Isso significa que não tivemos muito tempo para dedicar ao open.mp por um bom tempo. + +Mas as coisas voltaram a avançar recentemente: ainda estamos vivos, o projeto está realmente andando mais rápido do que nunca, e fizemos mais progresso nas últimas semanas do que vínhamos fazendo há muito tempo! + +Estamos muito orgulhosos do trabalho que está sendo feito aqui e da equipe incrível e refinada que temos. + +Vamos dar informações mais detalhadas nos próximos meses, mas queríamos garantir que todos soubessem que não abandonamos o open.mp, que a paixão ainda está aqui e que estamos fazendo o melhor que podemos. Então, por favor, continuem com a gente, pois teremos novidades, capturas de tela e vídeos muito em breve! + +Enquanto isso, venham passar um tempo com a gente no Discord! Obrigado a todos os mais de 10.000 de vocês 🥰 + +Nosso servidor do Discord é um espaço acolhedor e amigável para jogadores e amigos de TODOS os mods e comunidades multiplayer de San Andreas! Algumas das coisas que promovemos são: + +✅ Comunidade: Passe um tempo com os membros frequentes, conheça novas pessoas, encontre velhos amigos e jogadores veteranos, encontre pessoas do seu país/região nos canais de idiomas específicos, conheça pessoas de SA-MP / MTA / outros mods multiplayer + +✅ Scripting: Aprenda a criar scripts, receba ajuda com seus scripts, ajude outras pessoas + +✅ Divulgação de servidores: Mostre seu servidor SA-MP nos canais dedicados + +✅ Programação e tecnologia: Converse e receba ajuda com outras linguagens de programação e desenvolvimento de software, suporte técnico, conheça outras pessoas com interesses parecidos para trabalhar junto + +✅ Gaming: Encontre pessoas para jogar (não apenas SA!), converse sobre notícias e atualizações de jogos + +✅ Showcase: Você é YouTuber? Streamer? Artista? Faz música legal? É chef? Talvez pesque? Ou monte carros? Seja lá do que você se orgulha, mostre para todo mundo! + +✅ open.mp: Fique por dentro do progresso mais recente do desenvolvimento do open.mp e das movimentações no GitHub, passe um tempo com a equipe, assista às nossas streams de desenvolvimento exclusivas para VIPs do Discord quando elas voltarem a funcionar! diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-08-29-how-to-join-the-team.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-08-29-how-to-join-the-team.md new file mode 100644 index 00000000000..f3fa0e763c9 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2021-08-29-how-to-join-the-team.md @@ -0,0 +1,36 @@ +--- +slug: how-to-join-the-team +title: Como posso entrar para a equipe? +authors: potassium +--- + +Quer fazer parte da equipe do open.mp? Recebemos muito essa pergunta, então veja como você pode contribuir e se envolver! + + + +## Como posso entrar para a equipe? + +Recebemos MUITO essa pergunta, então achamos que deveríamos fazer uma publicação sobre isso! + +Primeiro, muito obrigado pelo interesse em contribuir! + +Como você sabe, somos todos jogadores veteranos de SA-MP que se uniram para manter vivo o mundo do multiplayer de SA. Somos apaixonados pela ideia de o projeto ser PARA os jogadores e PELOS jogadores, e é por isso que ele eventualmente será open-source. + +## Desenvolvimento + +No momento, estamos trabalhando nos ajustes finais para o lançamento beta e, quando ele estiver no ar, vamos apreciar muito e receber de braços abertos as contribuições da comunidade! Vamos precisar de ajuda para testar funcionalidades e casos extremos e, é claro, para procurar bugs e outros problemas que precisam de trabalho. + +O teste beta será uma parte extremamente importante da jornada de desenvolvimento, e adoraríamos que todos participassem. Então, por favor, fiquem atentos ao anúncio do teste beta, que prometemos que será muito, muito em breve! + +## Coordenadores regionais + +Você fala inglês E outro idioma fluentemente? Adoraríamos sua ajuda para traduzir nossas páginas da Wiki, nossas publicações no blog e nossas publicações nas redes sociais, além de ajudar a moderar as seções de idiomas do nosso Discord e do nosso fórum. + +As inscrições para essas posições estão fechadas no momento enquanto fazemos algumas mudanças, mas serão abertas novamente em breve! + +## Outras formas de ajudar + +- COMPARTILHE nossas publicações nas redes sociais +- CONVIDE outros jogadores de SA para o nosso Discord (discord.gg/samp) +- PARTICIPE da nossa comunidade no Discord +- AJUDE outros jogadores no Discord (scripting, tecnologia, qualquer coisa!) diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2022-09-08-server-beta-9.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2022-09-08-server-beta-9.md new file mode 100644 index 00000000000..186aad9e268 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2022-09-08-server-beta-9.md @@ -0,0 +1,70 @@ +--- +slug: server-beta-9 +title: Compatibilidade com SA-MP 0.3.DL, além de outros recursos adicionados e correções de bugs - LANÇAMENTO BETA DO SERVIDOR 9 +authors: potassium +--- + +Acabamos de lançar o open.mp server beta 9, trazendo grandes melhorias, correções e o aguardado suporte ao SA:MP 0.3.DL! Esta atualização inclui novos recursos, melhor compatibilidade com plugins e opções aprimoradas de configuração do servidor. + + + +Publicado no canal de anúncios do nosso servidor Discord por kseny ([discord.gg/samp](https://discord.gg/samp)) + +Olá a todos + +Acabamos de lançar o open.mp server beta 9, corrigindo vários problemas reportados e adicionando diversos novos recursos. A mudança mais notável é o suporte ao SA:MP 0.3.DL. Agora você pode executar servidores compatíveis com 0.3.7 e 0.3.DL a partir do mesmo binário. + +## Outras mudanças + +- Taxa de ticks dinâmica. Especifique uma taxa de ticks alvo, em vez de um tempo de sleep fixo. + - Use o comando de console `tickrate` para definir a taxa. + - `sleep` agora pode ser um float para acomodar taxas de tick precisas. +- Mais compatibilidade com plugins - fsutil, Discord connector (apenas com build não estática) +- Retorno de `SetSpawnInfo` corrigido. +- Corrige clima e horário não sendo redefinidos após GMX. +- Corrige vários bugs de GMX. +- Corrige vários comandos de console. +- Corrige `GetPlayerClass`. +- Corrige `GetVehicleLastDriver`. +- Adiciona a native `GetVehicles`. +- Adiciona a native `GetPlayers`. +- Adiciona a native `GetActors`. +- Todos os modos de lagcomp agora estão disponíveis via configuração. +- Corrige sincronização de trailer. +- Corrige `GetVehicleLastDriver`. +- Corrige `GetPlayerRotationQuat`. +- Corrige crash em componente de veículo. + +## SA:MP DL + +Esta é obviamente a grande notícia, e vem com uma série de novas configurações: + +- Implementadas todas as natives e callbacks do DL (`AddSimpleModel`, `AddSimpleModelTimed`, `GetPlayerCustomSkin`, `OnPlayerFinishedDownloading`, `OnPlayerRequestDownload`): + - A native `RedirectDownload` e o callback `OnPlayerRequestDownload` agora estão obsoletos em favor das opções de configuração de CDN. +- Adiciona a opção de configuração `artwork.enable` (legado: `useartwork`). +- Adiciona a opção de configuração `artwork.models_path` (legado: `artpath`). + - O servidor pode carregar modelos personalizados do arquivo `artconfig.txt`, como o SA:MP faz. +- A compatibilidade com 0.3.7 é preservada e pode ser configurada pela opção de configuração `network.allow_037_clients` (true por padrão). +- O servidor open.mp agora vem com um webserver embutido usado para servir modelos personalizados + - O webserver usa o endereço e a porta de bind do servidor open.mp. Permita conexões TCP na sua porta no firewall se você planeja usá-lo. + - Se o seu endereço IP público for diferente do endereço de bind (ex: você está atrás de um roteador), será necessário defini-lo na opção de configuração `network.public_addr`. + +## Observações + +- Devido a algumas mudanças, arquivos config.json antigos podem não funcionar corretamente. Use `./omp-server --default-config` para gerar um novo +- Usuários de server.cfg não são afetados. +- Ao permitir conexões 0.3.7, apenas 1000 objetos podem ser criados +- O servidor open.mp agora fornece dois tipos de builds Linux, standard e static. Recomendamos usar a build standard se possível; ela minimizará incompatibilidades com vários plugins. No entanto, ela exigirá openssl 1.1 instalado no seu sistema. Se você não conseguir instalar uma versão moderna do openssl no seu sistema (normalmente se ele for muito antigo), pode usar a build static, mas alguns plugins ou componentes podem falhar ao carregar e causar crash no servidor. + +## Includes oficiais + +Preparar um lançamento completo não é apenas ter um servidor funcionando, mas também todos os outros periféricos - bibliotecas, ferramentas, documentação e muito mais. No lado pawn, o open.mp é uma atualização significativa, com muitas melhorias de QoL já vistas por meio de correções e novas funções, e mais ainda por vir. Uma grande parte desse esforço é oferecer mais diagnósticos do compilador para encontrar problemas no código com antecedência, principalmente por meio de mais tags e const-correctness. Enquanto as versões oficiais ainda não saíram, você ainda pode ajudar enquanto isso testando seu código com os seguintes includes e ferramentas: + +https://github.com/pawn-lang/samp-stdlib/tree/consistency-overhaul +https://github.com/pawn-lang/pawn-stdlib/tree/backported-natives +https://github.com/openmultiplayer/upgrade +https://github.com/pawn-lang/compiler + +Eles foram originalmente desenvolvidos para melhorar os includes padrão do SA:MP, mas nunca foram totalmente lançados (ou seja, nunca foram mesclados na master, apesar do PR ter sido aceito). Os includes do open.mp se baseiam na fundação estabelecida aqui, então pense neles como um passo intermediário rumo à segurança completa de tags e const do open.mp; e como um feedback importante sobre a direção deles. Veja os links acima para muito mais informações e documentação sobre atualização. + +Como sempre, se você não quiser atualizar, códigos e includes antigos ainda funcionarão (pelo menos no primeiro lançamento). diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2023-01-05-release-candidate-1.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2023-01-05-release-candidate-1.md new file mode 100644 index 00000000000..c8a70c1a6e7 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2023-01-05-release-candidate-1.md @@ -0,0 +1,151 @@ +--- +slug: release-candidate-1 +title: Release Candidate 1 +authors: y_less +--- + +Finalmente chegou! 🎉 Depois de anos de desenvolvimento, reescritas e desafios, estamos empolgados em apresentar o Release Candidate 1 (RC1) do servidor open.mp. Isso marca um grande passo rumo ao nosso lançamento oficial 1.0, trazendo atualizações, recursos e melhorias significativas. + + + +Chegou! + +Finalmente chegou! + +Depois de quatro anos, duas reescritas, discussões e drama, e incontáveis outros obstáculos; finalmente chegou! + +Release Candidate 1 (RC1) do servidor open.mp. + +Isso, esperamos, representa a versão final do código para o nosso lançamento 1.0, e se tudo correr bem com esta versão poderemos finalmente **abrir** o chamado **open**.mp em apenas alguns dias a partir de agora. + +Antes de entrar na parte principal do lançamento, quero primeiro agradecer sinceramente a cada membro da equipe open.mp por ajudar o mod a chegar tão longe. Não foi fácil, principalmente pelo quanto todos estavam realmente envolvidos - todos queríamos o melhor para o mod, para a comunidade, para o SA:MP, para nossos servidores e para nossos jogadores; não teríamos embarcado nessa jornada se não fosse assim. Infelizmente, opiniões fortes e divergentes sobre o que é **melhor** às vezes causam atrito. Mas estamos aqui agora. Então, a todos, um enorme obrigado: + +- Amir +- Cheaterman +- Freaksken +- Graber +- Hual +- Josh +- JustMichael +- kseny +- Nexius +- pkfin +- Potassium +- Southclaws +- TommyB +- Y_Less +- Zeex +- E provavelmente mais... + +Enfim, agora a parte com a qual você realmente se importa... + +Agora que saímos do beta, estamos (se tudo correr bem esta semana) lançando no prazo. Então, junto com o próprio servidor, que você já viu uma dúzia de vezes antes, temos algumas novidades para vocês: + +## Pawn + +O download tem os includes oficiais, sem mais corrigir os includes antigos do SA:MP com `omp.inc`; agora estamos fazendo isso direito! Ele também tem um novo compilador. Já se perguntou quando a 3.10.11 chegaria? Bem, não espere mais (se você mesmo a compilou, pode pensar nesta como 3.10.12)! Com essa combinação, você provavelmente receberá muitos novos avisos, mas não se preocupe - também temos uma ferramenta para isso, para atualizar automaticamente uma boa quantidade de código, adicionando nomes de símbolos bem definidos, `const` e mais nos lugares certos. Talvez você já tenha notado isso, já vem usando há meses, mas a máquina virtual (a parte dentro do servidor) também foi atualizada! Ah, e todas aquelas natives de string que você conhece e adora, como `SendClientMessage` e `AddMenuItem`? Agora todas elas formatam. Todas elas[^1]. + +Uma lista completa do que está disponível: + +- Limite de tamanho de símbolo aumentado para 64, sem mais `OnPlyrDoTheTing` para tentar encaixar seus nomes. Levando a... +- Várias natives descomprimidas - `Col` é abreviação de `Colour` ou `Collision`? Agora você sabe! +- Tags. Tags em todos os lugares. Veja a documentação incluída. +- Os includes oficiais finalmente estão const-correct. Sem mais reclamações de que algumas pessoas talvez não os tenham. +- Versão do compilador atualizada: `__nameof`, `__addressof`, correções e coisas demais para listar aqui. +- `switch` está muito mais rápido. +- Mais avisos para problemas anteriormente não detectados. Quanto mais problemas o compilador puder encontrar, menos você precisa encontrar. +- Uma ferramenta *upgrader* para adicionar tags e `const` ao código do usuário e corrigir vários novos avisos. +- Nomenclatura mais consistente. Cada native foi examinada de perto e comparada para garantir o máximo nível de similaridade e intuitividade na nomenclatura. +- Adicionado `{Float, _}:...` em todos os lugares. O que isso significa? Significa quase não precisar mais de `format()`[^2] - pense em y_va, mas nativamente. +- `-O2`, o nível mais alto de otimização do pawn, funciona ao usar o novo compilador e a nova VM. Alguns includes podem precisar ser atualizados, mas alguns já foram. Para ajudar nisso... +- A macro `__optimisation` foi adicionada para que o código possa se configurar quando compilado com -O2. + +Documentação dos includes atualizados: +https://github.com/openmultiplayer/omp-stdlib + +Documentação do novo compilador: +https://github.com/openmultiplayer/compiler/ +https://github.com/pawn-lang/compiler/ + +Documentação do qawno: +https://github.com/openmultiplayer/qawno/ + +Documentação da ferramenta upgrader: +https://github.com/openmultiplayer/upgrade + +[^1]: Quase todas elas. + +[^2]: Quase não precisar mais de `format()`. + +## SDK + +Pawn é a forma tradicional, e ainda oficial, de escrever modes para o seu servidor. Ela não vai desaparecer, mas para aqueles de vocês que querem mais controle, estamos finalmente lançando o SDK completo (o *S*oftware *D*evelopment *K*it). Esta é uma interface C++ para o servidor, a mesma usada por todos os componentes que compõem o código principal do open.mp. Qualquer coisa que eles possam fazer, você também pode fazer (comparado a plugins, que foram projetados apenas para fornecer funções ao pawn, não para escrever modes). + +Temos alguma documentação em andamento; infelizmente isso leva tempo. Mas enquanto isso, aqui estão vários componentes de exemplo para aqueles de vocês que querem mergulhar direto. Todos são templates nos quais você pode se basear, e vão de basicamente nada até um componente totalmente funcional com os recursos mais comuns: + +https://github.com/openmultiplayer/empty-template +https://github.com/openmultiplayer/basic-template +https://github.com/openmultiplayer/pawn-template +https://github.com/openmultiplayer/full-template + +Alguns termos para você começar, para que possa entender o que está lendo: + +- *Component* - Uma peça lógica individual do servidor, como objects ou pickups. Aqueles de que você não precisa não precisam ser carregados. +- *Extension* - Código que estende outro pedaço de código. Você pode escrever component extensions, mas as mais comuns são player extensions, que definem alguma estrutura de dados a ser associada a um jogador além de todos os dados normais dele, como health e weapons. +- *UID* - *U*nique *ID*entifier, um número que representa o seu componente, e somente o seu componente. Isso é sempre obrigatório e pode ser obtido aqui: https://open.mp/uid +- *Entity* - Uma coisa, geralmente algo com que um jogador pode interagir e da qual você pode ter muitas. Objects são entities, mas outros jogadores também são entities; até commands em um processor poderiam ser chamados de entities. +- *Pool* - Algo que armazena entities. Quando você tem muitas, precisa conseguir acessá-las por nome ou ID de alguma forma; é isso que um pool faz. +- *Interface* - Components usam uma classe base abstrata como interface. Ela declara quais métodos um component tem, mas não contém o código desses métodos. Interfaces são passadas por aí para que components possam se comunicar entre si, mas as implementações são mantidas privadas. +- *SDK* - A coleção de todas as interfaces definidas pelo servidor core. +- *ABI* - Uma *A*pplication *B*inary *I*nterface é a forma como código compilado conversa com outro código compilado. As interfaces exportadas pelo SDK são *ABI stable*, o que significa que usar dois componentes compilados em momentos diferentes ainda funcionará em conjunto. +- *pawn-natives* - A biblioteca sobre a qual todas as declarações de natives são construídas. Usando um wrapper chamado *SCRIPT_API* ao redor desta biblioteca: https://github.com/openmultiplayer/pawn-natives +- *Event* - Algo que acontece externamente. Coisas como jogadores conectando e digitando comandos são events. Qualquer component pode definir events e avisar outros components quando esses events acontecem. +- *Handler* - Um component que quer saber quando um event acontece. + +Se você tiver dúvidas, o melhor lugar provavelmente são os novíssimos (revividos) fóruns: +https://forum.open.mp/ + +## Recursos + +Além de todos os novos recursos anunciados para pawn, há vários recursos novos (e recém-anunciados) no servidor: + +- Gang zones por jogador, como havia no YSF. +- Pickups por jogador, também como no YSF. +- `AttachPlayerObjectToPlayer`. +- Melhor suporte a PawnPlus. +- Suporte a `:memory:` e outros nomes especiais no SQLite. +- Flags de abertura do SQLite. +- Opção de configuração `exclude` para não carregar certos componentes. +- Mostrar erros de parsing de configuração, não apenas falhar silenciosamente. +- Verificação de versão major do SDK, só para o caso de algum dia fazermos grandes mudanças no servidor (esperamos que não). + +## Correções + +Houve alguns novos bugs introduzidos na beta 11, e alguns menores que sobraram de antes. Os corrigidos incluem: + +- Aviso de `funcidx` já registrado. +- Plugins GDK (streamer etc) sem natives. +- Crash aleatório em GMX. +- Callbacks GDK às vezes não chamados. +- Sem logging quando solicitado no componente SQLite. +- Algumas configurações não eram redefinidas em GMX. +- NPCs estavam conectando quando havia muitos de uma vez. +- `.so` ainda era necessário em nomes de plugins legados no Linux. + +## Links + +Primeiro, claro, a nova versão do servidor: +https://github.com/openmultiplayer/open.mp/releases + +Segundo, os fóruns voltaram. Vá até lá para todas as suas perguntas: +https://forum.open.mp/ + +Ou, se preferir: +https://vk.com/open_mp + +Em seguida, apesar de isso ter sido oferecido algumas vezes, resistimos explicitamente a qualquer dinheiro até este momento; porque não achávamos certo até termos provado nosso trabalho com um lançamento. Com este post, esse momento é agora, então se alguém quiser nos ajudar (todas as doações serão destinadas à infraestrutura e ao trabalho futuro de desenvolvimento do cliente), isso seria muito apreciado: + +https://www.patreon.com/open_mp +https://opencollective.com/openmultiplayer + +E, claro, tudo ainda está em desenvolvimento ativo, então confira regularmente todos os links acima para ver o que há de novo. diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2024-03-06-porting.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2024-03-06-porting.md new file mode 100644 index 00000000000..91e94439319 --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2024-03-06-porting.md @@ -0,0 +1,170 @@ +--- +slug: porting +title: Portando para open.mp +authors: y_less +--- + +O SA:MP ficou preso no limbo por anos, sem atualizações e com várias gambiarras só para manter as coisas funcionando. O open.mp muda isso — é uma reescrita completa que corrige problemas antigos, melhora o scripting e remove limites antigos, mantendo seu código existente funcionando. Mas o que isso realmente significa para você? Vamos explicar. + + + +:::warning + +O conteúdo do post a seguir está desatualizado e, em sua maioria, não tem relação com o estado atual do open.mp. O post está publicado aqui para fins de arquivo. + +::: + +Já estava claro há muito tempo que Kalcor não tinha mais interesse em manter o SA:MP; o que, por si só, tudo bem, mas como ele era a única pessoa com acesso oficial ao código-fonte, isso o transformou em um gargalo para novas atualizações. Tanto YSF quanto fixes.inc foram criados para preencher esse vazio — corrigir bugs e inconsistências no servidor sem ter acesso ao código-fonte; o primeiro como plugin e o segundo como include. Apesar de esforços monumentais para tornar esses (e outros) projetos tão estáveis, abrangentes e fáceis de usar quanto possível, eles naturalmente começaram a atingir seus limites e uma nova geração de correções se tornou necessária. É aí que o open.mp entra. + +Fundado nos mesmos princípios, e aproveitando todas as inúmeras melhorias desenvolvidas pela comunidade ao longo de uma década, o open.mp é uma reescrita do zero do servidor SA:MP original, com todas as correções de seus predecessores diretos e muitas outras que eram impraticáveis ou simplesmente impossíveis. É verdade que essa abordagem não veio sem controvérsia — alguns servidores desenvolveram seus próprios métodos privados para lidar com as peculiaridades do SA:MP, independentemente dos esforços da comunidade, mas essas não são técnicas que todo scripter deveria ter que desenvolver por conta própria, e este artigo ajudará na portabilidade de código existente. + +Esperamos abordar os principais pontos problemáticos, mas se houver algum que deixarmos passar, fique à vontade para entrar em contato via discord ou github e teremos prazer em corrigir o guia. + +A alternativa é desfazer as correções usando uma biblioteca que é a gêmea da fixes.inc: breaks.inc: + +https://github.com/pawn-lang/sa-mp-fixes/blob/master/breaks.inc + +Então fique à vontade para instalá-la e reverter para todos os comportamentos antigos de forma transparente por meio de hooks. + +## `Tags` + +Os includes do open.mp adicionam muitas novas tags às funções, embora ainda tentem encontrar um equilíbrio entre upgrades muito necessários e invasividade. Como essas mudanças podem ser muito amplas, escrevemos uma ferramenta para automatizar boa parte disso: + +## `HideMenuForPlayer` + +Esta função sempre recebeu um parâmetro de ID de menu, mas no SA:MP esse ID não era usado. Então, qualquer que fosse o valor fornecido, o menu atual do jogador era fechado, mesmo que ele não estivesse olhando para aquele que você disse para fechar. + +Código antigo poderia ser assim: + +```c +gShopMenu = CreateMenu("text", 2, 100.0, 30.0, 7.0); + +HideMenuForPlayer(gShopMenu, playerid); +``` + +Isso sempre fecharia o menu atual do jogador, independentemente de qual ele estivesse realmente vendo. Agora você precisará lembrar qual menu ele está vendo, ou simplesmente obtê-lo: + +```c +gShopMenu = CreateMenu("text", 2, 100.0, 30.0, 7.0); + +HideMenuForPlayer(GetPlayerMenu(playerid), playerid); +``` + +## `SetPlayerAttachedObject` + +Objetos anexados no SA:MP sobreviviam a uma mudança de gamemode, mas no open.mp eles não sobrevivem. Se você quiser que um jogador mantenha seus objetos após um reinício do modo, terá que adicioná-los novamente em `OnPlayerConnect`: + +```c +enum E_ATTACHMENT_DATA +{ + E_ATTACHMENT_DATA_MODEL, + E_ATTACHMENT_DATA_BONE, + E_ATTACHMENT_DATA_OFFSET_X, + E_ATTACHMENT_DATA_OFFSET_Y, + E_ATTACHMENT_DATA_OFFSET_Z, + E_ATTACHMENT_DATA_ROT_X, + E_ATTACHMENT_DATA_ROT_Y, + E_ATTACHMENT_DATA_ROT_Z, + E_ATTACHMENT_DATA_SCALE_X, + E_ATTACHMENT_DATA_SCALE_Y, + E_ATTACHMENT_DATA_SCALE_Z, + E_ATTACHMENT_DATA_COLOUR_1, + E_ATTACHMENT_DATA_COLOUR_2, +} + +public OnPlayerConnect(playerid) +{ + for (new i = 0; i != MAX_OBJECT_ATTACHMENT_SLOTS; ++i) + { + SetPlayerAttachedObject( + playerid, + i, + gAttachementData[playerid][E_ATTACHMENT_DATA_MODEL], + gAttachementData[playerid][E_ATTACHMENT_DATA_BONE], + gAttachementData[playerid][E_ATTACHMENT_DATA_OFFSET_X], + gAttachementData[playerid][E_ATTACHMENT_DATA_OFFSET_Y], + gAttachementData[playerid][E_ATTACHMENT_DATA_OFFSET_Z], + gAttachementData[playerid][E_ATTACHMENT_DATA_ROT_X], + gAttachementData[playerid][E_ATTACHMENT_DATA_ROT_Y], + gAttachementData[playerid][E_ATTACHMENT_DATA_ROT_Z], + gAttachementData[playerid][E_ATTACHMENT_DATA_SCALE_X], + gAttachementData[playerid][E_ATTACHMENT_DATA_SCALE_Y], + gAttachementData[playerid][E_ATTACHMENT_DATA_SCALE_Z], + gAttachementData[playerid][E_ATTACHMENT_DATA_COLOUR_1], + gAttachementData[playerid][E_ATTACHMENT_DATA_COLOUR_2] + ); + } +} +``` + +## Dinheiro ao morrer + +Quando um jogador morre em San Andreas, $100 são deduzidos dele automaticamente para cobrir as contas do hospital. Esse recurso permanece no SA:MP, mas foi removido do open.mp para permitir que scripts gerenciem todo o próprio dinheiro. Vários scripts já tentam corrigir isso adicionando $100 a um jogador depois da morte, ou ao nascer. Se esse for o seu script, simplesmente remova a correção adicional, embora o código no open.mp tente levar em conta scripts que fazem isso. Se seu script dependia desse recurso, basta adicionar o seguinte código em `OnPlayerDeath`: + +```c +GivePlayerMoney(playerid, -100); +``` + +## Game texts + +O SA:MP tem seis estilos diferentes de game text, mas vários deles são basicamente inutilizáveis. Um fica aparecendo e desaparecendo constantemente, um desaparece após um tempo definido independentemente do tempo que você colocou, e um nunca desaparece independentemente do tempo selecionado. No entanto, descobriu-se que todos esses estilos de game text podem ser reproduzidos com precisão[^1] usando text draws. Assim, fixes.inc e, posteriormente, open.mp fizeram isso. A aparência dos game texts é a mesma de antes, com a vantagem de que todos os estilos são utilizáveis, e a desvantagem de que eles não fazem mais fade in e fade out. + +```c +FadingGameTextForPlayer(playerid, const format[], time, style) +{ + if (style > 6) + { + // Não há versão com fade desses estilos. + GameTextForPlayer(playerid, format, time, style) + } + else + { + // Envia uma mensagem bruta via Pawn.RakNet + } +} +``` + +[^1]: Com uma exceção notável: o novo estilo de game text de relógio. Por algum motivo desconhecido, a cor do relógio é diferente para pessoas diferentes, o que levou a muita discussão sobre a melhor forma de replicar esse estilo até que a discrepância fosse encontrada. Tivemos que escolher uma das duas por consistência. + +## Tamanhos dos pools + +`GetPlayerPoolSize`, `GetActorPoolSize` e `GetVehiclePoolSize` eram um tanto sem sentido quando foram introduzidas pela primeira vez; retornavam o maior ID conectado, que não tem relação com o número de jogadores conectados, e chegaram muito depois de métodos de loop muito melhores já existirem. Ser meio bobo não é, por si só, motivo para remover as funções, mas infelizmente elas também estão quebradas e retornam dados incorretos quando não há jogadores conectados. Não há como corrigir esses valores de retorno de uma forma que seja ao mesmo tempo retrocompatível e correta daqui para frente (acredite, tentamos). Diante desses fatos, optamos por simplesmente remover as funções. Use apenas um loop normal ou `foreach`: + +```c +foreach (new i : Player) +{ +} +``` + +Alguns scripts travaram quando essa mudança foi introduzida, mas apenas ao usar a seguinte forma de loop: + +```c +for (new i = 0; i != GetPlayerPoolSize(); ++i) +{ +} +``` + +Embora, como o maior valor é um jogador real quando há pessoas online, esse código esteja errado de qualquer forma — ele deixa uma pessoa de fora. + +## Grafias + +O SA:MP é muito inconsistente nas grafias usadas no código — algumas coisas usam inglês britânico, outras usam americano: + +- `Bumper` - Britânico +- `Hood` - Americano +- `Armour` - Britânico +- `Stereo` - Americano + +Unificamos isso e adotamos as grafias britânicas. Então, por exemplo: + +```c +TextDrawBoxColor(Text:textid, boxColor); +``` + +Agora é: + +```c +TextDrawBoxColour(Text:textid, boxColour); +``` + +A ferramenta de upgrade cuidará automaticamente da maioria desses casos. diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md new file mode 100644 index 00000000000..a51dac3897e --- /dev/null +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md @@ -0,0 +1,37 @@ +--- +slug: launcher-false-positive +title: Falso positivo do Windows Defender no Launcher +authors: [iamir, itsneufox] +--- + +Alguns usuários relataram que o **Windows Defender está sinalizando o open.mp Launcher como um Trojan/vírus**. Isso é um **falso positivo**; o launcher é completamente seguro para uso. + +O launcher é **totalmente open source** e você pode revisá-lo ou compilá-lo por conta própria: +[https://github.com/openmultiplayer/launcher](https://github.com/openmultiplayer/launcher) + +Nós **já estamos trabalhando para corrigir isso**, para que builds futuras não sejam sinalizadas. + + + +## O que fazer por enquanto + +Até que a Microsoft atualize suas assinaturas de detecção, adicione a pasta do launcher como uma exclusão no Windows Defender: + +1. Abra a **Segurança do Windows** (procure por ela no menu Iniciar) +2. Vá para **Proteção contra vírus e ameaças** +3. Em **Configurações de proteção contra vírus e ameaças**, clique em **Gerenciar configurações** +4. Role para baixo até **Exclusões** e clique em **Adicionar ou remover exclusões** +5. Clique em **Adicionar uma exclusão** → **Pasta** +6. Selecione sua **pasta de instalação do open.mp launcher** e confirme +7. Feche e reabra o launcher + +### Observações + +- Exclua a **pasta inteira do launcher**, não arquivos individuais, porque os hashes dos arquivos mudam entre atualizações. +- Se o Defender ainda mostrar um aviso depois de adicionar a exclusão, feche completamente o launcher, verifique novamente o caminho da exclusão e tente de novo. + +## Por que isso acontece? + +Falsos positivos são comuns em softwares relacionados a jogos. Heurísticas de antivírus podem sinalizar programas legítimos que interagem com processos de jogos. Estamos trabalhando com a Microsoft para que o launcher seja colocado corretamente na lista de permissões. + +Ainda tem dúvidas? Entre em contato pelo nosso [Discord](https://discord.gg/samp). From 43fdcdcc3195f88c0b2813326bb34722cbbe57aa Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:47:48 +0100 Subject: [PATCH 09/11] Update Portuguese translations and fix callback references in documentation --- .../scripting/callbacks/OnActorStreamIn.md | 2 +- .../scripting/callbacks/OnActorStreamOut.md | 2 +- .../callbacks/OnPlayerCommandText.md | 2 +- .../scripting/callbacks/OnPlayerConnect.md | 2 +- .../callbacks/OnPlayerEnterCheckpoint.md | 2 +- .../callbacks/OnPlayerEnterRaceCheckpoint.md | 2 +- .../callbacks/OnPlayerKeyStateChange.md | 2 +- .../callbacks/OnPlayerLeaveCheckpoint.md | 2 +- .../callbacks/OnPlayerLeaveRaceCheckpoint.md | 2 +- .../callbacks/OnPlayerObjectMoved.md | 2 +- .../callbacks/OnPlayerRequestSpawn.md | 2 +- .../callbacks/OnPlayerStateChange.md | 2 +- .../scripting/callbacks/OnPlayerText.md | 2 +- .../scripting/callbacks/OnPlayerUpdate.md | 2 +- .../scripting/callbacks/OnVehicleStreamIn.md | 2 +- .../scripting/callbacks/OnVehicleStreamOut.md | 2 +- .../scripting/functions/GetVehicleSeats.md | 26 +++++++++---------- .../scripting/functions/EnableTirePopping.md | 2 +- 18 files changed, 30 insertions(+), 30 deletions(-) diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md index 821868ecc4b..eec0d23aa1d 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamIn.md @@ -34,6 +34,6 @@ public OnActorStreamIn(actorid, forplayerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md index 41de10d08d9..fbfb135c895 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnActorStreamOut.md @@ -34,6 +34,6 @@ public OnActorStreamOut(actorid, forplayerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerCommandText.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerCommandText.md index fd90a59ffc4..054fb21af1a 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerCommandText.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerCommandText.md @@ -43,7 +43,7 @@ public OnPlayerCommandText(playerid, cmdtext[]) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerConnect.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerConnect.md index 2e97e680f84..e6a8bf032fd 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerConnect.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerConnect.md @@ -39,6 +39,6 @@ public OnPlayerConnect(playerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterCheckpoint.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterCheckpoint.md index d5e0c9b3513..bb6826c46c8 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterCheckpoint.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterCheckpoint.md @@ -38,7 +38,7 @@ public OnPlayerEnterCheckpoint(playerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterRaceCheckpoint.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterRaceCheckpoint.md index 76fe664eab7..05c060962ba 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterRaceCheckpoint.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerEnterRaceCheckpoint.md @@ -29,7 +29,7 @@ public OnPlayerEnterRaceCheckpoint(playerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerKeyStateChange.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerKeyStateChange.md index 7e190d282aa..529cbe5a4ac 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerKeyStateChange.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerKeyStateChange.md @@ -22,7 +22,7 @@ Esta callback é chamada quando o estado de qualquer tecla [suportada](../resour ## Notas - + :::tip diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveCheckpoint.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveCheckpoint.md index c009b4249df..bbb98efe806 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveCheckpoint.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveCheckpoint.md @@ -29,7 +29,7 @@ public OnPlayerLeaveCheckpoint(playerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveRaceCheckpoint.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveRaceCheckpoint.md index be329178c5b..cace107e1d2 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveRaceCheckpoint.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerLeaveRaceCheckpoint.md @@ -29,7 +29,7 @@ public OnPlayerLeaveRaceCheckpoint(playerid) ## Notes - + ## Related Functions diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerObjectMoved.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerObjectMoved.md index 2de4022010b..148fe24fcc9 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerObjectMoved.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerObjectMoved.md @@ -32,7 +32,7 @@ public OnPlayerObjectMoved(playerid, objectid) :::tip - + ::: diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestSpawn.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestSpawn.md index a4b9aa29a6b..bd803ecc210 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestSpawn.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerRequestSpawn.md @@ -33,7 +33,7 @@ public OnPlayerRequestSpawn(playerid) ## Notas - + :::tip diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerStateChange.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerStateChange.md index af9b897341f..0c4d648ced0 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerStateChange.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerStateChange.md @@ -37,7 +37,7 @@ public OnPlayerStateChange(playerid, PLAYER_STATE:newstate, PLAYER_STATE:oldstat ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerText.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerText.md index ce36f1d70b8..2620f21fe38 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerText.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerText.md @@ -32,7 +32,7 @@ public OnPlayerText(playerid, text[]) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerUpdate.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerUpdate.md index 5d2776d564c..ccc55557b69 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerUpdate.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnPlayerUpdate.md @@ -76,7 +76,7 @@ public OnPlayerUpdate(playerid) ## Notas - + :::warning diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md index f9dfb906ac0..2ea78465cfd 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamIn.md @@ -34,6 +34,6 @@ public OnVehicleStreamIn(vehicleid, forplayerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamOut.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamOut.md index acdda9b2ada..d8405c7a1c5 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamOut.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/callbacks/OnVehicleStreamOut.md @@ -32,6 +32,6 @@ public OnVehicleStreamOut(vehicleid, forplayerid) ## Notas - + ## Funções Relacionadas diff --git a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetVehicleSeats.md b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetVehicleSeats.md index 67ed261b9fc..8c82386e2f5 100644 --- a/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetVehicleSeats.md +++ b/frontend/i18n/pt-BR/docusaurus-plugin-content-docs/current/scripting/functions/GetVehicleSeats.md @@ -1,27 +1,27 @@ --- title: GetVehicleSeats sidebar_label: GetVehicleSeats -description: Gets the number of seats in the vehicle. +description: Obtém o número de assentos no veículo. tags: ["vehicle"] --- -## Description +## Descrição -Gets the number of seats in the vehicle. +Obtém o número de assentos no veículo. -| Name | Description | -| ------- | ------------------------ | -| modelid | ID of the vehicle model. | +| Nome | Descrição | +| ------- | ------------------------- | +| modelid | ID do modelo do veículo. | -## Return Values +## Valores de Retorno -Returns the number of seats. +Retorna o número de assentos. -**255** if the model is invalid. +**255** se o modelo for inválido. -## Examples +## Exemplos ```c new vehicleid = GetPlayerVehicleID(playerid); @@ -29,10 +29,10 @@ new modelid = GetVehicleModel(vehicleid); new seats = GetVehicleSeats(modelid); new string[64]; -format(string, sizeof(string), "Number of seats in this vehicle: %d", seats); +format(string, sizeof(string), "Número de assentos neste veículo: %d", seats); SendClientMessage(playerid, -1, string); ``` -## Related Functions +## Funções Relacionadas -- [PutPlayerInVehicle](PutPlayerInVehicle): Puts a player in a vehicle. +- [PutPlayerInVehicle](PutPlayerInVehicle): Coloca um jogador em um veículo. diff --git a/frontend/i18n/th/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md b/frontend/i18n/th/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md index 2fb392e947b..6fedd276de9 100644 --- a/frontend/i18n/th/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md +++ b/frontend/i18n/th/docusaurus-plugin-content-docs/current/scripting/functions/EnableTirePopping.md @@ -32,7 +32,7 @@ public OnGameModeInit() :::warning -This function was removed in SA-MP 0.3. Tire popping is enabled by default. If you want to disable tire popping, you'll have to manually script it using OnVehicleDamageStatusUpdate. +This function was removed in SA-MP 0.3. Tire popping is enabled by default. If you want to disable tire popping, you'll have to manually script it using [OnVehicleDamageStatusUpdate](../callbacks/OnVehicleDamageStatusUpdate). ::: From 7c6a5ccb21e65fa72ea815dbeca228c506633666 Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:47:54 +0100 Subject: [PATCH 10/11] Update authors list in launcher false positive documentation --- .../2025-02-12-launcher-false-positive.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/i18n/zh-CN/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md b/frontend/i18n/zh-CN/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md index cdc0bb2d2ec..d003c723493 100644 --- a/frontend/i18n/zh-CN/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md +++ b/frontend/i18n/zh-CN/docusaurus-plugin-content-blog/2025-02-12-launcher-false-positive.md @@ -1,7 +1,7 @@ --- slug: launcher-false-positive title: Windows Defender 对启动器的误报问题 -authors: itsneufox +authors: [iamir, itsneufox] --- 部分用户报告,**Windows Defender 将 open.mp 启动器误报为木马/病毒**。这是一个**误报**,该启动器完全可以安全使用。 From c20b1cf45d4498745686a1e2625ff9cfe8e507e8 Mon Sep 17 00:00:00 2001 From: itsneufox <156133096+itsneufox@users.noreply.github.com> Date: Thu, 21 May 2026 23:48:12 +0100 Subject: [PATCH 11/11] Add translation support for various components and pages --- frontend/src/components/Toast.tsx | 7 +- .../components/templates/lowercase-note.tsx | 20 +++- .../templates/npc-callbacks-tip.tsx | 10 +- frontend/src/lib/downloads/common.tsx | 16 ++- frontend/src/pages/animations.tsx | 32 ++++- frontend/src/pages/downloads/launcher.tsx | 12 +- frontend/src/pages/downloads/server.tsx | 12 +- frontend/src/pages/index.tsx | 62 +++++++--- frontend/src/pages/partners.tsx | 12 +- frontend/src/pages/servers/index.tsx | 112 +++++++++++++++--- 10 files changed, 245 insertions(+), 50 deletions(-) diff --git a/frontend/src/components/Toast.tsx b/frontend/src/components/Toast.tsx index 3fce120f1f4..fa7c34bc856 100644 --- a/frontend/src/components/Toast.tsx +++ b/frontend/src/components/Toast.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useState } from "react"; +import { translate } from "@docusaurus/Translate"; interface Toast { id: string; @@ -55,7 +56,11 @@ export const ToastContainer = () => { setToasts((prev) => prev.filter((t) => t.id !== toast.id)) } className="toast-close" - aria-label="Close toast" + aria-label={translate({ + id: "toast.close", + message: "Close toast", + description: "Accessible label for closing a toast notification", + })} > × diff --git a/frontend/src/components/templates/lowercase-note.tsx b/frontend/src/components/templates/lowercase-note.tsx index b09a99ca353..391cd612791 100644 --- a/frontend/src/components/templates/lowercase-note.tsx +++ b/frontend/src/components/templates/lowercase-note.tsx @@ -1,9 +1,27 @@ import Admonition from "../Admonition"; +import Translate, { translate } from "@docusaurus/Translate"; export default function NoteLowercase({ name = "function" }) { + const translatedName = + name === "function" + ? translate({ + id: "lowercaseNote.name.function", + message: "function", + description: "Default item name in a lowercase-name warning", + }) + : name; + return ( -

This {name} starts with a lowercase letter.

+

+ + {"This {name} starts with a lowercase letter."} + +

); } diff --git a/frontend/src/components/templates/npc-callbacks-tip.tsx b/frontend/src/components/templates/npc-callbacks-tip.tsx index da6f394423b..05dce1ce667 100644 --- a/frontend/src/components/templates/npc-callbacks-tip.tsx +++ b/frontend/src/components/templates/npc-callbacks-tip.tsx @@ -1,9 +1,17 @@ import Admonition from "../Admonition"; +import Translate from "@docusaurus/Translate"; export default function TipNpcCallback() { return ( -

This callback can also be called by NPC.

+

+ + This callback can also be called by NPC. + +

); } diff --git a/frontend/src/lib/downloads/common.tsx b/frontend/src/lib/downloads/common.tsx index 630eef3a6d1..3c054e75653 100644 --- a/frontend/src/lib/downloads/common.tsx +++ b/frontend/src/lib/downloads/common.tsx @@ -1,5 +1,5 @@ import Link from "@docusaurus/Link"; -import Translate from "@docusaurus/Translate"; +import Translate, { translate } from "@docusaurus/Translate"; import Heading from "@theme/Heading"; import Layout from "@theme/Layout"; import React, { useState } from "react"; @@ -24,6 +24,8 @@ export interface Release { } export interface ProductConfig { + layoutTitle: string; + layoutDescription: string; pageTitle: React.ReactNode; pageSubtitle: React.ReactNode; releasesUrl: string; @@ -132,7 +134,7 @@ export function ReleaseListPage({ config }: ReleaseListPageProps): React.ReactEl const hasMore = releases.length > INITIAL_VISIBLE_RELEASES; return ( - +
{config.pageTitle} @@ -234,7 +236,15 @@ export function ReleaseListPage({ config }: ReleaseListPageProps): React.ReactEl )} - + diff --git a/frontend/src/pages/animations.tsx b/frontend/src/pages/animations.tsx index 8c87591b279..527283a8bd7 100644 --- a/frontend/src/pages/animations.tsx +++ b/frontend/src/pages/animations.tsx @@ -1,7 +1,7 @@ import React, { useState, useMemo, useEffect } from "react"; import Layout from "@theme/Layout"; import Heading from "@theme/Heading"; -import Translate from '@docusaurus/Translate'; +import { default as Translate, translate } from '@docusaurus/Translate'; import { animations, getLibraries, @@ -77,8 +77,16 @@ const AnimationsPage = () => { return (
@@ -156,7 +164,11 @@ const AnimationsPage = () => { target.style.display = "none"; const errorDiv = document.createElement("div"); errorDiv.className = styles.errorMessage; - errorDiv.textContent = "Video not available"; + errorDiv.textContent = translate({ + id: "animations.videoUnavailable", + message: "Video not available", + description: "Fallback message when an animation video fails to load", + }); target.parentNode?.appendChild(errorDiv); }} /> @@ -203,10 +215,18 @@ const AnimationsPage = () => { Usage Examples:
                       
-                        {`// For players
+                        {`${translate({
+                          id: "animations.code.forPlayers",
+                          message: "// For players",
+                          description: "Comment in animation usage example for player animations",
+                        })}
 ApplyAnimation(playerid, "${currentAnimation.library}", "${currentAnimation.name}", 4.1, false, false, false, false, SYNC_ALL);
 
-// For actors
+${translate({
+  id: "animations.code.forActors",
+  message: "// For actors",
+  description: "Comment in animation usage example for actor animations",
+})}
 ApplyActorAnimation(actorid, "${currentAnimation.library}", "${currentAnimation.name}", 4.1, false, false, false, false, SYNC_ALL);`}
                       
                     
diff --git a/frontend/src/pages/downloads/launcher.tsx b/frontend/src/pages/downloads/launcher.tsx index 86d164ea358..e73bf14328c 100644 --- a/frontend/src/pages/downloads/launcher.tsx +++ b/frontend/src/pages/downloads/launcher.tsx @@ -1,4 +1,4 @@ -import Translate from "@docusaurus/Translate"; +import Translate, { translate } from "@docusaurus/Translate"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import React from "react"; @@ -89,6 +89,16 @@ export default function LauncherDownloadsPage(): React.ReactElement { return ( open.mp Launcher diff --git a/frontend/src/pages/downloads/server.tsx b/frontend/src/pages/downloads/server.tsx index cfa3e965456..f903bfba7b5 100644 --- a/frontend/src/pages/downloads/server.tsx +++ b/frontend/src/pages/downloads/server.tsx @@ -1,4 +1,4 @@ -import Translate from "@docusaurus/Translate"; +import Translate, { translate } from "@docusaurus/Translate"; import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; import React from "react"; @@ -89,6 +89,16 @@ export default function ServerDownloadsPage(): React.ReactElement { return ( open.mp Server diff --git a/frontend/src/pages/index.tsx b/frontend/src/pages/index.tsx index 265f8065474..6c04a1845f6 100644 --- a/frontend/src/pages/index.tsx +++ b/frontend/src/pages/index.tsx @@ -9,41 +9,47 @@ import React, { useState } from "react"; import Admonition from "../components/Admonition"; import styles from "./index.module.css"; -import Translate from '@docusaurus/Translate'; +import { default as Translate, translate } from '@docusaurus/Translate'; const socials = [ { - alt: "Discord icon", + labelId: "homepage.social.discord", + labelMessage: "Discord icon", src: "/images/assets/discord-icon.svg", href: "https://discord.com/invite/samp", size: 45, }, { - alt: "Facebook icon", + labelId: "homepage.social.facebook", + labelMessage: "Facebook icon", src: "/images/assets/facebook.svg", href: "https://www.facebook.com/openmultiplayer", size: 33, }, { - alt: "Instagram icon", + labelId: "homepage.social.instagram", + labelMessage: "Instagram icon", src: "/images/assets/instagram.svg", href: "https://instagram.com/openmultiplayer/", size: 33, }, { - alt: "Twitch icon", + labelId: "homepage.social.twitch", + labelMessage: "Twitch icon", src: "/images/assets/twitch.svg", href: "https://twitch.tv/openmultiplayer", size: 29, }, { - alt: "X (formerly Twitter) icon", + labelId: "homepage.social.x", + labelMessage: "X (formerly Twitter) icon", src: "/images/assets/x.svg", href: "https://x.com/openmultiplayer", size: 29, }, { - alt: "YouTube icon", + labelId: "homepage.social.youtube", + labelMessage: "YouTube icon", src: "/images/assets/youtube.svg", href: "https://youtube.com/openmultiplayer", size: 35, @@ -53,27 +59,34 @@ const socials = [ const SocialIcons = () => { return (
- {socials.map((social, index) => ( + {socials.map((social, index) => { + const label = translate({ + id: social.labelId, + message: social.labelMessage, + description: "Accessible label and image alt text for homepage social link", + }); + return ( {social.alt} - ))} + ); + })}
); }; @@ -132,7 +145,11 @@ const HomepageHeader = () => { @@ -169,7 +186,11 @@ const HomepageHeader = () => {
Download Launcher 🎮 @@ -177,7 +198,11 @@ const HomepageHeader = () => { Download Server 🖥️ @@ -201,7 +226,12 @@ const Home = (): React.ReactElement => { return (
@@ -211,4 +241,4 @@ const Home = (): React.ReactElement => { ); }; -export default Home; \ No newline at end of file +export default Home; diff --git a/frontend/src/pages/partners.tsx b/frontend/src/pages/partners.tsx index bacfdecb343..e53e109ddee 100644 --- a/frontend/src/pages/partners.tsx +++ b/frontend/src/pages/partners.tsx @@ -183,8 +183,16 @@ const Page = (): ReactNode => { return (

diff --git a/frontend/src/pages/servers/index.tsx b/frontend/src/pages/servers/index.tsx index f0e2c48156c..69459675436 100644 --- a/frontend/src/pages/servers/index.tsx +++ b/frontend/src/pages/servers/index.tsx @@ -131,22 +131,55 @@ const AddServer = ({ onAdd }: { onAdd: (server: ServerAllData) => void }) => { const server = (await response.json()) as ServerAllData; onAdd(server); showToast({ - message: `${server.core.hn} is added to our pending list. If it's not available after maximum 48 hours, you can contact us on Discord!`, - title: "Server Submitted!", + message: translate( + { + id: "servers.add.successMessage", + message: + "{serverName} is added to our pending list. If it's not available after maximum 48 hours, you can contact us on Discord!", + description: + "Toast message shown after submitting a server to the pending list", + }, + { serverName: server.core.hn }, + ), + title: translate({ + id: "servers.add.successTitle", + message: "Server Submitted!", + description: "Toast title shown after a server submission succeeds", + }), type: "success", }); } else { const error = (await response.json()) as { error: string }; showToast({ - message: `Status ${response.statusText}: ${error?.error}`, - title: "Submission failed!", + message: translate( + { + id: "servers.add.failureMessage", + message: "Status {status}: {error}", + description: "Toast message shown after a server submission fails", + }, + { status: response.statusText, error: error?.error ?? "" }, + ), + title: translate({ + id: "servers.add.failureTitle", + message: "Submission failed!", + description: "Toast title shown after a server submission fails", + }), type: "error", }); } } catch (error) { showToast({ - message: "An error occurred while submitting the server", - title: "Error", + message: translate({ + id: "servers.add.errorMessage", + message: "An error occurred while submitting the server", + description: + "Toast message shown after an unexpected server submission error", + }), + title: translate({ + id: "servers.add.errorTitle", + message: "Error", + description: "Generic toast error title", + }), type: "error", }); } finally { @@ -166,13 +199,19 @@ const AddServer = ({ onAdd }: { onAdd: (server: ServerAllData) => void }) => { setValue(e.target.value)} className="servers-input" />

@@ -280,7 +319,9 @@ const List = ({ data }: { data: CoreServerData[] }) => { onClick={() => setIsModalOpen(true)} className="button button--primary button--md2" > - Add server + + Add server +
@@ -292,7 +333,9 @@ const List = ({ data }: { data: CoreServerData[] }) => { onChange={(e) => setShowEmpty(e.target.checked)} className="servers-checkbox" /> - Show empty servers + + Show empty servers +
@@ -330,24 +377,43 @@ const List = ({ data }: { data: CoreServerData[] }) => { setIsModalOpen(false)}>
-

Add a server

+

+ + Add a server + +

- + { setIsModalOpen(false); }} />

- IP must be in format ip:port + ip:port }} + > + {"IP must be in format {format}"} +

@@ -356,7 +422,9 @@ const List = ({ data }: { data: CoreServerData[] }) => { onClick={() => setIsModalOpen(false)} className="button button--primary button--md2" > - Close + + Close +
@@ -389,8 +457,16 @@ const Page = (): ReactNode => { return (
{loading ? : }