15 Commits
b0 .. b4
Author SHA1 Message Date
Yury 1bfb16539f Fix error message to match console log 2025-02-13 21:00:08 +02:00
Yury 7d0b7546b0 Update features 2025-02-13 20:57:48 +02:00
Yury 07d36f3e8b Update specific steps and troubleshooting section 2025-02-13 20:56:10 +02:00
Yury 60bdd081d7 Fix steam appid file name 2025-02-10 12:49:48 +02:00
Yury 9ff4cb62dd Fix prereq 2025-02-10 12:13:50 +02:00
Yury e5ee2245bd Fix ASP.NET Core Runtime requirement 2025-02-09 23:22:48 +02:00
Yury 217143e0f4 Fix empty checkboxes 2025-02-09 22:59:33 +02:00
Yury 2acab6d810 Add feature list 2025-02-09 22:55:18 +02:00
Yury fc76dcafe1 Mention bug with missing body parts 2025-02-09 22:36:32 +02:00
Yury 78e6d0743b Mention that Steam has to run 2025-02-09 22:12:13 +02:00
Yury 66c7e87f53 Fix step 6 heading 2025-02-09 21:18:14 +02:00
Yury a070988c51 Fix numbering 2025-02-09 21:17:25 +02:00
Yury 8c4a09d456 Fix admonitions 2025-02-09 21:14:33 +02:00
Yury a11b3f3477 Add generate_ssl.py source 2025-02-09 21:13:42 +02:00
Yury 90deaca674 Update README 2025-02-09 21:10:50 +02:00
6 changed files with 240 additions and 28 deletions
+190 -28
View File
@@ -1,46 +1,208 @@
# Prospect
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/AeonLucid/Prospect/build.yml?style=for-the-badge)](https://github.com/AeonLucid/Prospect/actions)
Also known as "The Cycle: Frontier".
This repository is just something I work on when bored, do not expect much at this stage.
## Features
- [x] Connect with localhost instead of official servers
- [ ] Basic authentication
- [ ] Basic lobby functionality
- [ ] CloudScript
- [ ] ?
* [x] Basic login with Steam.
* [x] EULA acceptance.
* [x] Tutorial.
* [x] Single-player station (Season 2 and Season 3).
* Basic station functionality:
* [ ] Onboarding
* [x] Talk to Badum
* [x] Equip items
* [ ] Deploy to Fortuna
* [ ] Matchmaking
* [x] Can deploy through matchmaking
* [ ] Items insurance
* [ ] Free loadouts (Season 3)
* [ ] Gameplay
* [ ] Can evac
* [ ] Can do quests
* [ ] Inventory and loadout
* [x] Items can be equipped
* [x] Items can be unequipped.
* [x] Loadout is carried into matchmaking
* [x] Items are automatically stacked
* [x] Weapon mods can be equipped
* [x] Weapon appearance can be changed
* [ ] Quests
* [x] Quests can be accepted
* [ ] Quests can be removed
* [ ] Quests can be completed
* [ ] Job boards
* [x] Faction progression
* [ ] Season pass
* [x] Character appearance and emotes
* [ ] Shops
* [x] Items can be bought
* [x] Items can be sold (balance and progression is received)
* [ ] Crafting station
* [ ] Season pass
* [ ] Quarters
* [ ] Generator
* [ ] Quarter upgrades
* [x] Player balance
* [x] K-Marks
* [x] Aurum
* [x] Insurance Tokens
## API Development setup
## Running locally
### 1. Download the game
> [!NOTE]
> If you've already done all steps previously, you can skip to Step 7.
If you are enrolled into the closed beta, you can download a fresh copy with [SteamRE/DepotDownloader](https://github.com/SteamRE/DepotDownloader).
### 1. Prerequisites
```
.\DepotDownloader.exe -app 1600360 -depot 1600361 -manifest 720055916602660127 -username <username>
```
Before you start, you'll need the following software downloaded and installed:
This gives you the [exact copy](https://steamdb.info/depot/1600361/history/?changeid=M:720055916602660127) that is used for this repository.
1. [MongoDB Community Edition](https://fastdl.mongodb.org/windows/mongodb-windows-x86_64-8.0.4-signed.msi).
### 2. Download the latest launcher
1. [Latest `Prospect.Server.Api`](https://github.com/deiteris/Prospect/releases) from the Releases section
Navigate to the [latest successful](https://github.com/AeonLucid/Prospect/actions) build. Extract the launcher files to a directory.
1. [.NET Runtime 8.0](https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win-x64&os=win10&apphost_version=8.0.11) installed.
Run the launcher with the first argument being the path of step 1.
```
./Prospect.Launcher.exe "E:\Depots\depots\1600361\7593680"
```
1. [ASP.NET Core 8.0](https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=8.0.0&arch=x64&rid=win-x64&os=win10) installed.
### 3. Clone the repository
1. A compatible The Cycle: Frontier game client. The server works with:
```
git clone https://github.com/AeonLucid/Prospect.git
```
1. The latest version from [Steam](https://steamcommunity.com/app/868270).
### 4. Open the solution
> [!WARNING]
> The latest version of The Cycle: Frontier does not work with Windows 11 24H2!
Open the `src/Prospect.sln` in either Rider or Visual Studio.
1. Season 2 client downloaded from SteamDB using a depot downloader. For example, [version 2.7.2](https://steamdb.info/depot/868271/history/?changeid=M:4623363103423775682).
### 2. Unpack `Prospect.Server.Api`
Use your favorite ZIP archiver and unzip the `Prospect.Server.Api.zip` downloaded from this repository.
### 3. Patch the `hosts` file
To be able to connect to the locally running server, you must replace the IP address of `2EA46.playfabapi.com` that the game uses. Do the following:
1. Open Notepad as Administrator.
1. Click **File** > **Open...** and select `C:\Windows\System32\drivers\etc\hosts`.
1. At the end of the file, add `127.0.0.1 2EA46.playfabapi.com` on a new line. Do not add the `#` character!
### 4. Generate and import SSL certificate
> [!IMPORTANT]
> Do not share the generated certificate! Generated certificate includes a private key that may be used to generate other certificates and compromise your security.
A connection to the server is served over a secured connection. The server uses self-signed certificate that must be added to trusted authorities in order for the game
to successfully communicate with the local server. Do the following:
1. Open the folder with `Prospect.Server.Api`.
1. Double-click `generate_ssl.exe`. `certificate.pfx` will appear in the same folder.
1. Double-click `certificate.pfx`. The Certificate Import Wizard will open:
1. Select **Current User** under Store Location and click **Next**.
1. Leave **File to Import** unchanged and click **Next**.
1. Leave **Password** empty and click **Next**.
1. Select **Place all certificates in the following store** > **Browse...**. Choose **Trusted Root Certification Authorities** and click **OK**. Click **Next**.
1. Click **Finish**. A Security Warning popup may appear, make sure it specifies `2EA46.playfabapi.com` certification authority and click **Yes**.
### 5. Add `steam_appid` to the game
1. Open the folder with The Cycle: Frontier and navigate to **Prospect** > **Binaries** > **Win64**.
1. Right-click in the folder > **New** > **Text Document**, and name it `steam_appid`.
1. Open `steam_appid` and enter `480`.
1. Save and close the file.
### 6. Create a game shortcut with specified arguments
1. Open the folder with The Cycle: Frontier and navigate to **Prospect** > **Binaries** > **Win64**.
1. Right-click `Prospect-Win64-Shipping.exe` > **Create Shortcut**.
1. Right-click the created shortcut > **Properties**.
1. In the **Target** field, add the following parameters after the quote ` -empty -server -log -windowed -noeac -nointro -steam_auth PF_TITLEID=2EA46`. Note the space after the quote.
1. Move the shortcut to desktop.
### 7. Run the server
Now you are all set! Open the folder with `Prospect.Server.Api` and run `Prospect.Server.Api.exe`. It will open a console if it runs successfully.
> [!IMPORTANT]
> Do not close the console when you run the game.
>
> If the console does not open, make sure you have [.NET Runtime 8.0](https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win-x64&os=win10&apphost_version=8.0.11) and [ASP.NET Core 8.0](https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=8.0.0&arch=x64&rid=win-x64&os=win10) installed.
### 8. Run the game
Once the server is running, make sure that Steam is running and open The Cycle: Frontier using the shortcut you've created before.
### Troubleshooting and FAQ
#### How to remove the certificate?
If you've installed the certificate for the **Current User**:
1. Open **Start** and enter `certmgr.msc`.
1. Expand **Trusted Root Certification Authorities** and select **Certificates**.
1. Find `2EA46.playfabapi.com`, right-click it > **Delete**.
If you've installed the certificate for the **Local Machine**, repeat the same steps but instead open `certlm.msc`.
#### `generate_ssl.exe` is flagged as a virus
`generate_ssl.exe` is a Python application packed with PyInstaller and some anti-viruses may flag it as a virus.
This application is a simple certificate generator and you can find its source code in `utils/generate_ssl.py`.
#### Body parts are missing with Season 3 client
Currently, the server loads body part IDs for Season 2 by default, so this is expected. You can fix this by going to station and changing your character appearance. This will store the updated body part IDs for your character.
#### Prospect.Server.Api does not start
Make sure you have [.NET Runtime 8.0](https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win-x64&os=win10&apphost_version=8.0.11) and [ASP.NET Core 8.0](https://aka.ms/dotnet-core-applaunch?framework=Microsoft.AspNetCore.App&framework_version=8.0.0&arch=x64&rid=win-x64&os=win10) installed.
#### Login Failed. Error code: 3
Make sure that:
* You have Steam running.
* You have created and **saved** the `steam_appid` file as described in step 6.
* The `steam_appid` file type is "TXT File".
#### Login Failed. Error code: 5
Make sure that:
* `Prospect.Server.Api` server is running.
* The `C:\Windows\System32\drivers\etc\hosts` file contains `127.0.0.1 2EA46.playfabapi.com` and that the file is **saved**.
If the server works and the `hosts` file is saved, `Alt+Tab` to a game console that opens when you start the game and check for the following:
* `libcurl error 7 (Couldn't connect to server)` - indicates that the `Prospect.Server.Api` is not running.
![](./_assets/connection_refused_error.png)
* `InvalidAPIEndpoint` - indicates that the `hosts` file was not updated properly.
![](./_assets/invalid_api_endpoint.PNG)
* `libcurl error 60 (Peer certificate cannot be authenticated with given CA certificates)` - indicates that the certificate was not installed correctly. Make sure that the certificate is present in `certmgr.msc` and there is only one certificate. Try removing the certificate and importing it again by following step 4.
![](./_assets/certificate_error.PNG)
* `HTTP code: 500` - usually indicates that MongoDB is not running. Make sure that MongoDB is installed and and that `MongoDB Server` is running in `services.msc`.
![](./_assets/mongodb_error.PNG)
## Development
TBD
Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 83 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

+50
View File
@@ -0,0 +1,50 @@
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding
from cryptography.x509 import NameOID, CertificateBuilder
from cryptography import x509
import datetime
# Generate private key
private_key = rsa.generate_private_key(
public_exponent=65537,
key_size=4096
)
# Generate self-signed certificate
subject = issuer = x509.Name([
x509.NameAttribute(NameOID.COMMON_NAME, '2EA46.playfabapi.com'),
])
cert = CertificateBuilder().subject_name(
subject
).issuer_name(
issuer
).public_key(
private_key.public_key()
).serial_number(
x509.random_serial_number()
).not_valid_before(
datetime.datetime.utcnow()
).not_valid_after(
datetime.datetime.utcnow() + datetime.timedelta(days=365)
).add_extension(
x509.BasicConstraints(ca=True, path_length=None), critical=True
).sign(private_key, hashes.SHA256())
# Export PKCS12 file
from cryptography.hazmat.primitives.serialization.pkcs12 import serialize_key_and_certificates
pfx_data = serialize_key_and_certificates(
name=b"The Cycle: Frontier backend",
key=private_key,
cert=cert,
cas=None,
encryption_algorithm=serialization.NoEncryption()
)
# Save to file
with open("certificate.pfx", "wb") as f:
f.write(pfx_data)
print("PKCS#12 certificate (certificate.pfx) created successfully.")