diff --git a/.gitignore b/.gitignore index 8944657..42c9ecf 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,6 @@ _site/** api/** -!api/index.md \ No newline at end of file +!api/index.md + +.vscode/ diff --git a/.vscode/launch.json b/.vscode/launch.json deleted file mode 100644 index 345304b..0000000 --- a/.vscode/launch.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - // Use IntelliSense to learn about possible attributes. - // Hover to view descriptions of existing attributes. - // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 - "version": "0.2.0", - "configurations": [ - { - "name": "Run open.mp gamemode", - "type": "dotnet", - "request": "launch", - "projectPath": "${workspaceFolder}/sampsharp-src/test/TestMode.OpenMp.Entities/TestMode.OpenMp.Entities.csproj" - } - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index f56dc72..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "chat.tools.terminal.autoApprove": { - "docfx": true, - "test": true - }, - "cSpell.words": ["blockquotes", "frontmatter", "sampsharp", "textdraw"] -} diff --git a/.vscode/tasks.json b/.vscode/tasks.json deleted file mode 100644 index 976aeb9..0000000 --- a/.vscode/tasks.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "version": "2.0.0", - "tasks": [ - { - "label": "docfx serve", - "type": "shell", - "command": "docfx", - "args": ["--serve"], - "isBackground": true, - "problemMatcher": [] - } - ] -} diff --git a/README.md b/README.md index ed98bd4..876ac6a 100644 --- a/README.md +++ b/README.md @@ -65,13 +65,13 @@ All documentation is written in Markdown in the `docs/` folder. For Markdown syn ``` docs/ -├── index.md # Home page -├── getting-started.md # Getting started guide -├── core-concepts/ -│ ├── toc.yml # Core concepts table of contents +├── index.md # Home page (redirects to quick-start) +├── quick-start.md # Quick Start guide +├── getting-started.md # Redirect stub for legacy URL +├── core-concepts/ # ECS pages (linked directly from root TOC) +│ ├── index.md # Entity-Component-System overview │ └── ... -├── features/ -│ ├── toc.yml # Features table of contents +├── features/ # Feature pages (linked directly from root TOC) │ └── ... ├── reference/ │ ├── toc.yml # Reference table of contents diff --git a/cspell.json b/cspell.json new file mode 100644 index 0000000..07497c4 --- /dev/null +++ b/cspell.json @@ -0,0 +1,10 @@ +{ + "version": "0.2", + "words": [ + "blockquotes", + "frontmatter", + "gamemode", + "sampsharp", + "textdraw" + ] +} diff --git a/docs/core-concepts/entities-components.md b/docs/core-concepts/entities-components.md index 2c921ea..af5415e 100644 --- a/docs/core-concepts/entities-components.md +++ b/docs/core-concepts/entities-components.md @@ -74,21 +74,21 @@ entityManager.AddComponent(childId, parentId); - Destroying a parent entity will recursively destroy all its children and their components. -### Entity Hierarchy Example +### Example: round-scoped entities -Below is a diagram showing entities, their nested structure, and attached components: +A common use case for entity hierarchies is **lifetime grouping**: tie a set of transient entities to a single parent, then destroy the parent to clean them all up at once. All `IWorldService.Create*` methods accept an optional `parent` parameter for exactly this. +For example, a deathmatch round that spawns weapon pickups and a control zone can parent everything to a `Round` entity. Destroying that entity at the end of the round removes the pickups and gang zone in one call: ```mermaid graph TD - A(Root Entity) --> B[Player] - A --> C[BankAccount] - A --> E[Inventory] - A --> D(Child Entity) - D --> F[Vehicle] - D --> I[IgnitionLock] - A --> G(Another Child Entity) - G --> H[QuestStatus] + R(Round Entity) --> RC[Round] + R --> P1(Pickup Entity) + P1 --> P1C[Pickup] + R --> P2(Pickup Entity) + P2 --> P2C[Pickup] + R --> GZ(GangZone Entity) + GZ --> GZC[GangZone] ``` ## Destroying Entities and Components diff --git a/docs/core-concepts/index.md b/docs/core-concepts/index.md index 8f1513e..dcf9a3c 100644 --- a/docs/core-concepts/index.md +++ b/docs/core-concepts/index.md @@ -1,90 +1,40 @@ --- title: Entity-Component-System -uid: core-concepts +uid: ecs-overview --- -# Core Concepts +# Entity-Component-System -## Entity-Component-System (ECS) +SampSharp is built on the **Entity-Component-System** (ECS) architecture. Every gamemode you write organizes its logic into three concepts: -SampSharp is built on the **Entity-Component-System** (ECS) architecture, a powerful design pattern that separates data from logic and provides a flexible, scalable approach to building game modes. This chapter explains the fundamental concepts you need to understand to work effectively with SampSharp. +- **Entities** — unique identifiers for things in the game world (a player, a vehicle, a custom item). +- **Components** — data attached to entities (a `Player`'s `Position`, a `BankAccount` you defined). +- **Systems** — logic that operates on entities by reading their components and responding to events. -### What is ECS? +Rather than deep class inheritance, ECS uses **composition**: you build complex entities by attaching whichever components they need. -The Entity-Component-System is an architectural pattern that organizes game objects and their behavior through three key concepts: +## How the pieces fit together -1. **Entities** - the objects in your game world -2. **Components** - the data that describes those objects -3. **Systems** - the logic that operates on the data +```mermaid +graph LR + E[Entity] -->|has| C[Components] + C -->|read / mutated by| S[System] + Ev[Event] -->|triggers| S +``` -Rather than using traditional object-oriented inheritance (where a "Player" class inherits from a "Character" class which inherits from a "GameObject"), ECS uses **composition**: you create a base entity and attach components to it to define what it is and what it can do. +When events arrive, the dispatcher passes the relevant components from the involved entities into your system methods — you do not query for components directly. -### Entities +### Example: a player picks up an item -An **entity** is a unique identifier representing something in your game world. It could be a player, a vehicle, a building, an item, or any other object. +1. open.mp fires a pickup event. +2. A system receives the `Player` and `Pickup` components. +3. The system updates the player's inventory based on the pickup data. +4. The system removes the pickup entity. -In SampSharp, entities are extremely lightweight—they're essentially just containers. An entity only has meaning when components are attached to it; an entity without components doesn't exist or serve any purpose in the system. +### Example: a player exits a vehicle -**Key characteristics:** -- Each entity has a unique ID -- Entities only exist when they have at least one component -- Multiple entities can exist simultaneously -- Entities can be created and destroyed dynamically +1. open.mp fires a vehicle exit event. +2. A system receives the `Player` and `Vehicle` components. +3. The system calculates a fare based on distance traveled and gives money to the player. +4. The system logs the ride for statistics. -> For more information on entities, see . - -### Components - -A **component** is a container that holds data and functionality related to a specific aspect of an entity. Components are the "nouns" of your system—they describe what properties and capabilities an entity has. - -Unlike traditional object-oriented design where you might create a deep inheritance hierarchy (Player → Character → GameObject), ECS uses composition: you create an entity and attach whatever components it needs. This makes it easy to create complex entities by combining simpler pieces. - -**Key characteristics:** -- Components hold data and related methods -- An entity can have any combination of components -- You can add or remove components from entities dynamically -- Components can be queried to find entities with specific combinations -- Different components can work together to create complex behaviors - -> For more information about components, see . - -### Systems - -A **system** is the logic layer of ECS. Systems read data from components and perform operations based on that data. A system typically operates on entities that have a specific set of components. - -Systems are responsible for implementing all the game logic—they query for entities with the components they care about, then perform operations on that data. - -**Key characteristics:** -- Systems contain all the business logic for a particular behavior -- Systems query for entities with specific component combinations -- Systems operate on data without owning it -- Systems are independent and can run in any order -- Logic is decoupled from data storage - -> For more information about systems, see . - -### Events - -In SampSharp, **events** are notifications that occur when something happens in the open.mp server (like a player connecting, a player request class, or game mode initialization). Systems can handle these events by implementing methods decorated with the `[Event]` attribute. - -When an event fires, SampSharp automatically calls your handler method and passes the relevant entity components and services as parameters, allowing your system to react to world changes. - -> For more information about events, see . - -### How It Works Together - -Here's how ECS operates in practice with SampSharp: - -**Example - handling a pickup event:** -1. A player picks up an item in the world -2. open.mp fires a pickup event -3. A system receives the event with the `Player` and `Pickup` components -4. The system updates the player's inventory based on the pickup data -5. The system removes the pickup entity - -**Example - handling a vehicle event:** -1. A player exits a vehicle -2. open.mp fires a vehicle exit event -3. A system receives the event with the `Player` and `Vehicle` components -4. The system calculates a fare based on distance traveled and gives money to the player -5. The system logs the ride for statistics \ No newline at end of file diff --git a/docs/core-concepts/systems.md b/docs/core-concepts/systems.md index aa881be..d26e33b 100644 --- a/docs/core-concepts/systems.md +++ b/docs/core-concepts/systems.md @@ -5,9 +5,9 @@ uid: systems # Systems -In SampSharp's Entity-Component-System (ECS) architecture, **systems** are classes that contain the logic for your game mode. Systems process entities and their components, respond to events, and can handle player or console commands. They are the main way to organize your server's behavior, keeping your code modular and maintainable. +In SampSharp's Entity-Component-System (ECS) architecture, **systems** are classes that contain the logic for your gamemode. Systems process entities and their components, respond to events, and can handle player or console commands. They are the main way to organize your server's behavior, keeping your code modular and maintainable. -For a high-level overview of ECS and systems, see . +For a high-level overview of ECS and systems, see . ## How to Create a System @@ -48,7 +48,7 @@ public class MyFirstSystem : ISystem [Event] public void OnGameModeInit(IWorldService world, IEntityManager entityManager) { - // Called when the game mode starts. + // Called when the gamemode starts. var vehicle = world.CreateVehicle(VehicleModelType.Landstalker, new Vector3(0, 6, 15), 45, 4, 4); vehicle.SetNumberPlate("SampSharp"); } diff --git a/docs/core-concepts/toc.yml b/docs/core-concepts/toc.yml deleted file mode 100644 index 504ac70..0000000 --- a/docs/core-concepts/toc.yml +++ /dev/null @@ -1,5 +0,0 @@ -items: -- href: index.md -- href: entities-components.md -- href: systems.md -- href: events.md diff --git a/docs/features/dialog-menus.md b/docs/features/dialog-menus.md index bfefc33..20248b2 100644 --- a/docs/features/dialog-menus.md +++ b/docs/features/dialog-menus.md @@ -32,7 +32,7 @@ Inject `IDialogService` into any event handler or system method and call `Show` public class MySystem : ISystem { [Event] - public void OnPlayerSpawn(Player player, IDialogService dialogs) + public void OnPlayerConnect(Player player, IDialogService dialogs) { var dialog = new MessageDialog( caption: "Welcome", @@ -53,7 +53,7 @@ public class MySystem : ISystem ```csharp [Event] -public async Task OnPlayerSpawn(Player player, IDialogService dialogs) +public async Task OnPlayerConnect(Player player, IDialogService dialogs) { var dialog = new MessageDialog("Welcome", "Press OK to continue.", "OK"); var response = await dialogs.ShowAsync(player, dialog); @@ -272,7 +272,7 @@ Because `ShowAsync` returns a `Task`, you can chain multiple dialogs in a single ```csharp [Event] -public async Task OnPlayerSpawn(Player player, IDialogService dialogs) +public async Task OnPlayerConnect(Player player, IDialogService dialogs) { var rules = new MessageDialog("Rules", "Do you accept the rules?", "Yes", "No"); var rulesResponse = await dialogs.ShowAsync(player, rules); @@ -402,7 +402,7 @@ public class MenuEventSystem : ISystem ``` > [!TIP] -> `OnPlayerSelectedMenuRow` fires globally — it is not scoped to a specific menu instance. When your game mode shows different menus to the same player, attach a custom [component](xref:entities-components) to the player that records which menu is currently visible, and read it in the event handler to dispatch the row to the right code. +> `OnPlayerSelectedMenuRow` fires globally — it is not scoped to a specific menu instance. When your gamemode shows different menus to the same player, attach a custom [component](xref:entities-components) to the player that records which menu is currently visible, and read it in the event handler to dispatch the row to the right code. ### Disabling rows diff --git a/docs/features/objects.md b/docs/features/objects.md index c5a09b4..40a9621 100644 --- a/docs/features/objects.md +++ b/docs/features/objects.md @@ -9,7 +9,7 @@ Objects are static or dynamic entities in the world that can be created, positio ## Creating Objects -To create a global object visible to all players, use : +To create a global object visible to all players, use : ```csharp [Event] @@ -30,7 +30,7 @@ See for all available parameters. ## Player Objects -Player objects are only visible to a specific player, making them useful for personalized or player-specific world elements. Create player objects using : +Player objects are only visible to a specific player, making them useful for personalized or player-specific world elements. Create player objects using : ```csharp [Event] diff --git a/docs/features/toc.yml b/docs/features/toc.yml deleted file mode 100644 index b4f6c7b..0000000 --- a/docs/features/toc.yml +++ /dev/null @@ -1,7 +0,0 @@ -items: -- href: command-system.md -- href: dialog-menus.md -- href: objects.md -- href: players.md -- href: timers.md -- href: vehicles.md diff --git a/docs/getting-started.md b/docs/getting-started.md index 9d4e0d5..d3717e6 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,108 +1,3 @@ --- -title: Getting Started -uid: getting-started +redirect_url: quick-start.html --- - -# Getting Started with SampSharp for open.mp - -Welcome to SampSharp! This guide will help you create and run your first gamemode using SampSharp v1.x for open.mp. - -## Prerequisites - -Before you begin, you'll need: - -- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet) or later -- open.mp server with SampSharp component (see [Setting Up open.mp Server](#setting-up-openmp-server)) -- A basic understanding of C# and object-oriented programming - -### Choose Your IDE - -# [Visual Studio](#tab/visualstudio) - -Install [Visual Studio](https://visualstudio.microsoft.com/) with the `.NET desktop development` workload: -1. Download and run the Visual Studio installer -2. Select the `.NET desktop development` workload during installation -3. Complete the installation - -> [!NOTE] -> The `.NET desktop development` workload includes the .NET 10 SDK, so you don't need to install it separately. - -# [Visual Studio Code](#tab/vscode) - -Install [Visual Studio Code](https://code.visualstudio.com/) and the required extensions: -- [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) -- [C# DevKit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) - ---- - -## Setting Up open.mp Server - -SampSharp requires a **64-bit version** of open.mp because the .NET runtime runs as x64. - -1. Download the x64 build from the [SampSharp open.mp x64 releases page](https://github.com/SampSharp/openmultiplayer-x64-builds/releases) and extract it anywhere on your system (e.g., `C:\open.mp` or `~/open.mp`). - -2. Download the SampSharp component from the [SampSharp releases page](https://github.com/ikkentim/SampSharp/releases) and extract it into the `components` directory of your open.mp server installation. - -## Creating Your First Project - -Install the SampSharp template: -```bash -dotnet new install SampSharp.Templates -``` - -Create a new project: -```bash -dotnet new sampsharp -n MyFirstGameMode -cd MyFirstGameMode -``` - -The template automatically creates: -- A configured `Startup.cs` class with the ECS framework initialized -- A sample `MyFirstSystem.cs` system with example events and commands -- A `.csproj` file with the necessary SampSharp NuGet package references - -**Startup.cs** implements `IEcsStartup` to configure the ECS framework, logging, and middleware. - -**MyFirstSystem.cs** is an example system showing how to handle events, commands, and access services. For more details on systems, see the page. - -## Running Your Gamemode - -### Configure Your IDE - -# [Visual Studio](#tab/visualstudio) - -1. Open the project in Visual Studio. -2. Press `F5` or go to **Debug** > **Start Debugging** to launch the project with the debugger attached. - -# [Visual Studio Code](#tab/vscode) - -Create a `.vscode/launch.json` file in your project root: -```json -{ - "version": "0.2.0", - "configurations": [ - { - "name": "SampSharp Gamemode", - "type": "dotnet", - "request": "launch", - "projectPath": "${workspaceFolder}/MyFirstGameMode.csproj" - } - ] -} -``` -Update the `projectPath` to match your project's `.csproj` file location. - ---- - -### Launch Steps - -1. **First Launch**: Start the debugger with your launch configuration. The application will prompt you to enter the path to your open.mp server directory. -2. **Enter Path**: Provide the full path to your open.mp installation (e.g., `C:\open.mp` or `/home/user/open.mp`). -3. **Configuration Generated**: A `launchSettings.json` file will be generated with your open.mp path, and the application will close. -4. **Second Launch**: Start the debugger again. The gamemode will now launch directly with your open.mp server, fully configured and ready to debug. - -## Next Steps - -- **Explore the Documentation**: Learn about , , and -- **Check Out Examples**: Visit the [SampSharp samples repository](https://github.com/sampsharp/samples) for complete example gamemodes -- **Join the Community**: Have questions? Join us on [Discord](https://discord.gg/gwcHpqp) where you can get help and discuss development with other SampSharp developers diff --git a/docs/index.md b/docs/index.md index b80fbcc..b72acf8 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,3 +1,3 @@ --- -redirect_url: getting-started.html +redirect_url: quick-start.html --- \ No newline at end of file diff --git a/docs/legacy/index.md b/docs/legacy/index.md index 06129fb..c96a9fd 100644 --- a/docs/legacy/index.md +++ b/docs/legacy/index.md @@ -10,7 +10,7 @@ uid: legacy-docs > > **We strongly recommend using the new SampSharp for open.mp (v1.x) for all new projects.** > -> The new version offers modern .NET support, active development, and many improvements. If you are starting a new project or planning to migrate, please refer to the and for SampSharp v1.x. +> The new version offers modern .NET support, active development, and many improvements. If you are starting a new project or planning to migrate, please refer to the and for SampSharp v1.x. > > If you are maintaining an existing SA-MP server, you may continue using these legacy docs. diff --git a/docs/quick-start.md b/docs/quick-start.md new file mode 100644 index 0000000..db3d7dd --- /dev/null +++ b/docs/quick-start.md @@ -0,0 +1,115 @@ +--- +title: Quick Start +uid: quick-start +--- + +# Quick Start + +Welcome to SampSharp! This guide will help you create and run your first gamemode using SampSharp v1.x for open.mp. + +## Prerequisites + +Before you begin, you'll need: + +- [.NET 10 SDK](https://dotnet.microsoft.com/download/dotnet) or later +- open.mp server with SampSharp component (see [Setting Up open.mp Server](#setting-up-openmp-server)) +- A basic understanding of C# and object-oriented programming + +### Choose Your IDE + +# [Visual Studio](#tab/visualstudio) + +Install [Visual Studio](https://visualstudio.microsoft.com/) with the `.NET desktop development` workload: +1. Download and run the Visual Studio installer +2. Select the `.NET desktop development` workload during installation +3. Complete the installation + +> [!NOTE] +> The `.NET desktop development` workload includes the .NET 10 SDK, so you don't need to install it separately. + +# [Visual Studio Code](#tab/vscode) + +Install [Visual Studio Code](https://code.visualstudio.com/) and the required extensions: +- [C#](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csharp) +- [C# DevKit](https://marketplace.visualstudio.com/items?itemName=ms-dotnettools.csdevkit) + +--- + +## Setting Up open.mp Server + +SampSharp requires a **64-bit version** of open.mp because the .NET runtime runs as x64. + +1. Download the x64 build from the [SampSharp open.mp x64 releases page](https://github.com/SampSharp/openmultiplayer-x64-builds/releases) and extract it anywhere on your system (e.g., `C:\open.mp` or `~/open.mp`). + +2. Download the SampSharp component from the [SampSharp releases page](https://github.com/ikkentim/SampSharp/releases) and extract it into the `components` directory of your open.mp server installation. + +3. **Verify the install.** Run `omp-server.exe` once from the open.mp directory and check the startup output for a line like `Successfully loaded component SampSharp (0.11.0.0)`. If SampSharp is missing from the loaded components list, the component files are not in the right place. You may see errors about `runtimeconfig.json` at the bottom of the log — those are expected at this stage since no gamemode has been built or wired up yet. Stop the server with `Ctrl+C` once verified. + +## Creating Your First Project + +Install the SampSharp template: +```bash +dotnet new install SampSharp.Templates +``` + +Create a new project: +```bash +dotnet new sampsharp -n MyFirstGameMode +cd MyFirstGameMode +``` + +The template automatically creates: +- A configured `Startup.cs` class with the ECS framework initialized +- A sample `MyFirstSystem.cs` system with example events and commands +- A `.csproj` file with the necessary SampSharp NuGet package references + +**Startup.cs** implements `IEcsStartup` to configure the ECS framework, logging, and middleware. + +**MyFirstSystem.cs** is an example system showing how to handle events, commands, and access services. For more details on systems, see the page. + +## Running Your Gamemode + +### Configure Your IDE + +# [Visual Studio](#tab/visualstudio) + +1. Open the project in Visual Studio. +2. Press `F5` or go to **Debug** > **Start Debugging** to launch the project with the debugger attached. + +# [Visual Studio Code](#tab/vscode) + +Create a `.vscode/launch.json` file in your project root: +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "SampSharp Gamemode", + "type": "dotnet", + "request": "launch", + "projectPath": "${workspaceFolder}/MyFirstGameMode.csproj" + } + ] +} +``` +Update the `projectPath` to match your project's `.csproj` file location. + +--- + +### Launch Steps + +The first launch is a one-time setup. The gamemode application starts on its own, detects it is not running inside an open.mp server, and helps you wire up a launch profile that starts the server with your gamemode loaded. Every launch after that reuses the profile. + +1. **First Launch**: Start the debugger with your launch configuration. The gamemode application starts in isolation, prints a setup banner, and prompts you to enter the path to your open.mp server directory. +2. **Enter Path**: Provide the full path to your open.mp installation (e.g., `C:\open.mp` or `/home/user/open.mp`). +3. **Profile Generated**: A `Properties/launchSettings.json` file is written with an `open.mp` profile pointing at `omp-server.exe`, and the gamemode exits. +4. **Second Launch**: Start the debugger again. Your IDE uses the `open.mp` profile to launch the server, which loads the gamemode and attaches the debugger. + +> [!TIP] +> `Properties/launchSettings.json` is a standard .NET launch profile file. It hardcodes the path to *your* open.mp install, so add it to `.gitignore` rather than committing it — teammates can regenerate their own profile on first launch. + +## Next Steps + +- **Jump to a Specific Topic**: Skip ahead to , , or another feature page. +- **Check Out Examples**: Visit the [SampSharp samples repository](https://github.com/sampsharp/samples) for complete example gamemodes +- **Join the Community**: Have questions? Join us on [Discord](https://discord.gg/gwcHpqp) where you can get help and discuss development with other SampSharp developers diff --git a/docs/reference/examples.md b/docs/reference/examples.md index 946c50a..eef8dce 100644 --- a/docs/reference/examples.md +++ b/docs/reference/examples.md @@ -10,7 +10,7 @@ uid: examples diff --git a/docs/support/platform-support.md b/docs/support/platform-support.md index 324e91b..e4176e8 100644 --- a/docs/support/platform-support.md +++ b/docs/support/platform-support.md @@ -29,7 +29,7 @@ SampSharp v1.x was created to overcome fundamental limitations in the legacy cod > SampSharp v1.x delivers: > > - **open.mp integration**: Built from the ground up to leverage open.mp's component extensibility platform, providing seamless integration with native open.mp features and future updates -> - **Modern .NET support**: Full support for latest .NET LTS releases (11, 12, etc.) on Windows and Linux +> - **Modern .NET support**: Full support for latest .NET releases (11, 12, etc.) on Windows and Linux > - **Better Linux support**: Reliable .NET runtime on Linux x86_64 > - **Cleaner architecture**: Built with modern C# and design patterns for easier maintenance and feature development @@ -66,7 +66,7 @@ If you're currently using SampSharp v0.x and considering upgrading to v1.x, see Ready to start with SampSharp v1.x? -- -- +- +- For legacy support and documentation, see the section. diff --git a/docs/toc.yml b/docs/toc.yml index d3d542c..938836f 100644 --- a/docs/toc.yml +++ b/docs/toc.yml @@ -1,12 +1,21 @@ items: -- href: getting-started.md -- href: core-concepts/toc.yml - name: Core Concepts +- name: Getting Started +- href: quick-start.md +- href: core-concepts/index.md + name: Entity-Component-System +- href: core-concepts/entities-components.md +- href: core-concepts/systems.md +- href: core-concepts/events.md - name: Features - href: features/toc.yml +- href: features/command-system.md +- href: features/dialog-menus.md +- href: features/objects.md +- href: features/players.md +- href: features/timers.md +- href: features/vehicles.md - name: Reference href: reference/toc.yml - name: Support href: support/toc.yml - name: Legacy - href: legacy/toc.yml \ No newline at end of file + href: legacy/toc.yml