0
0
mirror of https://github.com/sp-tarkov/modules.git synced 2025-02-13 05:30:43 -05:00

Reduce bot difficulty requests (!111)

Requires server-side changes (will need your help @TheSparta for this!).

This combined all the single bot difficulty requests into a single GET request (`/singleplayer/bot/difficulties`) with the following data structure:
```json
[
    {
        "role": "assault",
        "difficulty": "easy",
        "data": "assets/database/bots/types/assault.json difficulty easy contents"
    },
    {
        "role": "pmcbot",
        "difficulty": "normal",
        "data": "assets/database/bots/types/pmcbot.json difficulty normal contents"
    }
]
```
The request expects all roles and all their respective difficulties to be in the response.

Co-authored-by: Merijn Hendriks <merijnhendriks@users.noreply.github.com>
Reviewed-on: SPT-AKI/Modules#111
Reviewed-by: DrakiaXYZ <drakiaxyz@noreply.dev.sp-tarkov.com>
Co-authored-by: Merijn Hendriks <senko-san@noreply.dev.sp-tarkov.com>
Co-committed-by: Merijn Hendriks <senko-san@noreply.dev.sp-tarkov.com>
This commit is contained in:
Merijn Hendriks 2024-04-20 22:32:28 +00:00 committed by chomp
parent d5fc27e383
commit accb0ab9f6
4 changed files with 74 additions and 2 deletions

View File

@ -0,0 +1,24 @@
using System.Runtime.Serialization;
namespace Aki.Custom.Models
{
[DataContract]
public struct DifficultyInfo
{
[DataMember(Name = "role")]
public string Role;
[DataMember(Name = "difficulty")]
public string Difficulty;
[DataMember(Name = "data")]
public string Data;
public DifficultyInfo(string role, string difficulty, string data)
{
Role = role;
Difficulty = difficulty;
Data = data;
}
}
}

View File

@ -1,4 +1,4 @@
using Aki.Common.Http; using Aki.Custom.Utils;
using Aki.Reflection.Patching; using Aki.Reflection.Patching;
using Aki.Reflection.Utils; using Aki.Reflection.Utils;
using EFT; using EFT;
@ -21,7 +21,7 @@ namespace Aki.Custom.Patches
[PatchPrefix] [PatchPrefix]
private static bool PatchPrefix(ref string __result, BotDifficulty botDifficulty, WildSpawnType role) private static bool PatchPrefix(ref string __result, BotDifficulty botDifficulty, WildSpawnType role)
{ {
__result = RequestHandler.GetJson($"/singleplayer/settings/bot/difficulty/{role}/{botDifficulty}"); __result = DifficultyManager.Get(botDifficulty, role);
var resultIsNullEmpty = string.IsNullOrWhiteSpace(__result); var resultIsNullEmpty = string.IsNullOrWhiteSpace(__result);
if (resultIsNullEmpty) if (resultIsNullEmpty)
{ {

View File

@ -2,6 +2,7 @@ using Aki.Reflection.Patching;
using Aki.Reflection.Utils; using Aki.Reflection.Utils;
using Aki.Common.Http; using Aki.Common.Http;
using System.Reflection; using System.Reflection;
using Aki.Custom.Utils;
namespace Aki.Custom.Patches namespace Aki.Custom.Patches
{ {
@ -19,6 +20,11 @@ namespace Aki.Custom.Patches
[PatchPrefix] [PatchPrefix]
private static bool PatchPrefix(ref string __result) private static bool PatchPrefix(ref string __result)
{ {
// core difficulty is requested before the others
// so update the others now!
DifficultyManager.Update();
// update core difficulty
__result = RequestHandler.GetJson("/singleplayer/settings/bot/difficulty/core/core"); __result = RequestHandler.GetJson("/singleplayer/settings/bot/difficulty/core/core");
return string.IsNullOrWhiteSpace(__result); return string.IsNullOrWhiteSpace(__result);
} }

View File

@ -0,0 +1,42 @@
using System.Collections.Generic;
using EFT;
using Aki.Common.Http;
using Aki.Common.Utils;
using Aki.Custom.Models;
namespace Aki.Custom.Utils
{
public static class DifficultyManager
{
public static List<DifficultyInfo> Difficulties { get; private set; }
static DifficultyManager()
{
Difficulties = new List<DifficultyInfo>();
}
public static void Update()
{
// remove existing list
Difficulties.Clear();
// get new difficulties
var json = RequestHandler.GetJson("/singleplayer/settings/bot/difficulties");
Difficulties = Json.Deserialize<List<DifficultyInfo>>(json);
}
public static string Get(BotDifficulty botDifficulty, WildSpawnType role)
{
foreach (var entry in Difficulties)
{
if (botDifficulty.ToString().ToLower() == entry.Difficulty
&& role.ToString().ToLower() == entry.Role)
{
return entry.Data;
}
}
return string.Empty;
}
}
}