API/docs/Server-Modding-Guide.md
2026-01-24 16:47:19 -04:00

377 lines
8.5 KiB
Markdown

# Server Modding Guide
This guide explains how to create and install mods for the Galaxy Strike Online server.
## Overview
The Galaxy Strike Online server supports modding through a local SQLite database that stores mod data and assets. Mods can add new ships, items, quests, and game systems to the server.
## Mod Directory Structure
All mods are stored in the `GameServer/mods/` directory. Each mod has its own folder with the following structure:
```
GameServer/mods/
├── your-mod-name/
│ ├── mod.json # Mod manifest file
│ └── assets/ # Mod assets folder
│ ├── ships/ # Ship definitions
│ ├── items/ # Item definitions
│ ├── quests/ # Quest definitions
│ └── systems/ # Game system modifications
```
## Mod Manifest (mod.json)
Every mod must include a `mod.json` file in its root directory with the following structure:
```json
{
"name": "Your Mod Name",
"version": "1.0.0",
"author": "Your Name",
"description": "A brief description of your mod",
"dependencies": ["other-mod-name"],
"config": {
"setting1": "value1",
"setting2": 42
}
}
```
### Required Fields
- `name` - Unique identifier for your mod
- `version` - Version string (semantic versioning recommended)
- `author` - Mod author name
### Optional Fields
- `description` - Brief description of what your mod does
- `dependencies` - Array of mod names that must be loaded first
- `config` - Configuration options for your mod
## Asset Types
### Ships
Place ship definitions in `assets/ships/` as JSON files:
```json
{
"id": "custom_fighter",
"name": "Custom Fighter",
"description": "A powerful custom fighter ship",
"rarity": "rare",
"stats": {
"health": 150,
"maxHealth": 150,
"attack": 25,
"defense": 15,
"speed": 20,
"criticalChance": 0.10,
"criticalDamage": 2.0
},
"abilities": [
{
"id": "laser_burst",
"name": "Laser Burst",
"damage": 50,
"cooldown": 5
}
],
"requirements": {
"level": 10,
"credits": 5000
}
}
```
### Items
Place item definitions in `assets/items/` as JSON files:
```json
{
"id": "custom_blaster",
"name": "Custom Blaster",
"description": "A powerful custom blaster",
"type": "weapon",
"rarity": "epic",
"stats": {
"attack": 30,
"criticalChance": 0.15,
"criticalDamage": 2.5
},
"requirements": {
"level": 15,
"class": "fighter"
},
"value": 2500
}
```
### Quests
Place quest definitions in `assets/quests/` as JSON files:
```json
{
"id": "custom_mission",
"name": "Custom Mission",
"description": "A special custom mission",
"type": "combat",
"difficulty": "medium",
"objectives": [
{
"type": "defeat_enemies",
"target": "enemy_fighter",
"count": 10
},
{
"type": "collect_items",
"target": "energy_crystal",
"count": 5
}
],
"rewards": {
"experience": 1000,
"credits": 2000,
"items": ["custom_blaster"]
},
"requirements": {
"level": 12,
"completed_quests": ["basic_training"]
}
}
```
### Systems
Place system modifications in `assets/systems/` as JSON files:
```json
{
"id": "custom_combat_system",
"name": "Custom Combat System",
"description": "Modifies combat mechanics",
"type": "combat",
"modifications": {
"damage_formula": "base_damage * (1 + critical_chance * critical_damage)",
"speed_bonus": 1.2,
"defense_reduction": 0.9
},
"conditions": {
"player_level": 20,
"active_mods": ["advanced_combat"]
}
}
```
## Installation
### Automatic Installation
1. Create your mod folder in `GameServer/mods/`
2. Add your `mod.json` manifest and assets
3. Restart the GameServer or use the reload endpoint:
```bash
curl -X POST "http://localhost:3001/api/mods/reload" \
-H "Authorization: Bearer YOUR_TOKEN"
```
### Manual Installation via API
You can also manage mods through the API endpoints:
#### List all mods
```bash
curl -X GET "http://localhost:3001/api/mods" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### Enable a mod
```bash
curl -X POST "http://localhost:3001/api/mods/1/enable" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### Disable a mod
```bash
curl -X POST "http://localhost:3001/api/mods/1/disable" \
-H "Authorization: Bearer YOUR_TOKEN"
```
#### Set mod load order
```bash
curl -X POST "http://localhost:3001/api/mods/load-order" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"modIds": [1, 3, 2]}'
```
## Mod Development Best Practices
### 1. Use Unique IDs
Always use unique IDs for your assets to avoid conflicts:
```json
{
"id": "yourmodname_ship_name",
"name": "Ship Name"
}
```
### 2. Version Your Mods
Use semantic versioning (major.minor.patch):
- `1.0.0` - Initial release
- `1.1.0` - New features
- `1.1.1` - Bug fixes
- `2.0.0` - Breaking changes
### 3. Handle Dependencies
If your mod depends on other mods, specify them in `mod.json`:
```json
{
"dependencies": ["base_game_expansion", "common_items_pack"]
}
```
### 4. Test Thoroughly
- Test your mod with and without other popular mods
- Test different player levels and progressions
- Verify all assets load correctly
### 5. Provide Documentation
Include a README.md in your mod folder with:
- Installation instructions
- Configuration options
- Known issues
- Changelog
## Configuration
### Server Preferences
Set server-wide mod preferences via API:
```bash
curl -X POST "http://localhost:3001/api/mods/preferences/server" \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"key": "max_mods_per_player", "value": 10}'
```
### Mod-Specific Configuration
Access your mod's configuration in-game:
```javascript
const modConfig = await ModService.getModConfig('your-mod-name');
```
## Troubleshooting
### Common Issues
1. **Mod not loading**
- Check `mod.json` syntax
- Verify all required fields are present
- Check server logs for error messages
2. **Assets not appearing**
- Verify file paths are correct
- Check JSON syntax in asset files
- Ensure assets are in the correct subdirectories
3. **Load order issues**
- Set explicit load order via API
- Check dependencies are satisfied
- Verify dependent mods are enabled
4. **Performance issues**
- Limit the number of assets per mod
- Optimize JSON structures
- Use efficient algorithms in system modifications
### Debug Mode
Enable debug logging by setting the LOG_LEVEL environment variable:
```bash
LOG_LEVEL=debug npm start
```
## API Reference
### Authentication
All mod management endpoints require JWT authentication. Include your token in the Authorization header:
```
Authorization: Bearer YOUR_JWT_TOKEN
```
### Endpoints
| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/api/mods` | List all mods |
| GET | `/api/mods/:id` | Get specific mod |
| POST | `/api/mods/:id/enable` | Enable mod |
| POST | `/api/mods/:id/disable` | Disable mod |
| GET | `/api/mods/assets/:type` | Get assets by type |
| GET | `/api/mods/assets/:type/:assetId` | Get specific asset |
| GET | `/api/mods/load-order` | Get load order |
| POST | `/api/mods/load-order` | Set load order |
| GET | `/api/mods/preferences/server` | Get server preferences |
| POST | `/api/mods/preferences/server` | Set server preference |
| POST | `/api/mods/reload` | Reload mods from filesystem |
## Example Mod
Here's a complete example of a simple mod that adds a new ship:
### File Structure
```
GameServer/mods/
└── simple_ship_pack/
├── mod.json
└── assets/
└── ships/
└── scout_ship.json
```
### mod.json
```json
{
"name": "Simple Ship Pack",
"version": "1.0.0",
"author": "Example Author",
"description": "Adds a simple scout ship to the game"
}
```
### assets/ships/scout_ship.json
```json
{
"id": "simple_ship_pack_scout",
"name": "Scout Ship",
"description": "A fast and agile scout ship",
"rarity": "common",
"stats": {
"health": 80,
"maxHealth": 80,
"attack": 15,
"defense": 8,
"speed": 25,
"criticalChance": 0.08,
"criticalDamage": 1.8
},
"abilities": [
{
"id": "quick_scan",
"name": "Quick Scan",
"description": "Reveals nearby enemies",
"cooldown": 10
}
],
"requirements": {
"level": 5,
"credits": 1000
}
}
```
This mod will be automatically loaded when the server starts and will add the Scout Ship to the game, available for players to purchase at level 5.