mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-13 09:50:43 -05:00
Add experimental patch to make PMCs spawn at pmc spawn positions
This commit is contained in:
parent
b89af9f1ee
commit
9244abe669
@ -28,6 +28,7 @@
|
|||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\Aki.Common\Aki.Common.csproj" />
|
<ProjectReference Include="..\Aki.Common\Aki.Common.csproj" />
|
||||||
|
<ProjectReference Include="..\Aki.PrePatch\Aki.PrePatch.csproj" />
|
||||||
<ProjectReference Include="..\Aki.Reflection\Aki.Reflection.csproj" />
|
<ProjectReference Include="..\Aki.Reflection\Aki.Reflection.csproj" />
|
||||||
<ProjectReference Include="..\Aki.SinglePlayer\Aki.SinglePlayer.csproj" />
|
<ProjectReference Include="..\Aki.SinglePlayer\Aki.SinglePlayer.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -35,6 +35,8 @@ namespace Aki.Debugging
|
|||||||
// Debug command patches, can be disabled later
|
// Debug command patches, can be disabled later
|
||||||
new BTRDebugCommandPatch().Enable();
|
new BTRDebugCommandPatch().Enable();
|
||||||
new BTRDebugDataPatch().Enable();
|
new BTRDebugDataPatch().Enable();
|
||||||
|
|
||||||
|
new PMCBotSpawnLocationPatch().Enable();
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
101
project/Aki.Debugging/Patches/PMCBotSpawnLocationPatch.cs
Normal file
101
project/Aki.Debugging/Patches/PMCBotSpawnLocationPatch.cs
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
using System.Linq;
|
||||||
|
using System.Reflection;
|
||||||
|
using Aki.Reflection.Patching;
|
||||||
|
using EFT;
|
||||||
|
using EFT.UI;
|
||||||
|
using HarmonyLib;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using EFT.Game.Spawning;
|
||||||
|
using System;
|
||||||
|
using Aki.PrePatch;
|
||||||
|
|
||||||
|
namespace Aki.Debugging.Patches
|
||||||
|
{
|
||||||
|
|
||||||
|
// TODO: Instantiation of this is fairly slow, need to find best way to cache it
|
||||||
|
public class SptSpawnHelper
|
||||||
|
{
|
||||||
|
private readonly List<ISpawnPoint> playerSpawnPoints;
|
||||||
|
private readonly Random _rnd = new Random();
|
||||||
|
private readonly GStruct379 _spawnSettings = new GStruct379();
|
||||||
|
|
||||||
|
public SptSpawnHelper()
|
||||||
|
{
|
||||||
|
IEnumerable<ISpawnPoint> locationSpawnPoints = GClass2922.CreateFromScene();
|
||||||
|
|
||||||
|
var playerSpawns = locationSpawnPoints.Where(x => x.Categories.HasFlag(ESpawnCategoryMask.Player)).ToList();
|
||||||
|
this.playerSpawnPoints = locationSpawnPoints.Where(x => x.Categories.HasFlag(ESpawnCategoryMask.Player)).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void PrintSpawnPoints()
|
||||||
|
{
|
||||||
|
foreach (var spawnPoint in playerSpawnPoints)
|
||||||
|
{
|
||||||
|
ConsoleScreen.Log("[AKI PMC Bot spawn] Spawn point " + spawnPoint.Id + " location is " + spawnPoint.Position.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public ISpawnPoint SelectSpawnPoint()
|
||||||
|
{
|
||||||
|
// TODO: Select spawn points more intelligently
|
||||||
|
return this.playerSpawnPoints[_rnd.Next(this.playerSpawnPoints.Count)];
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ISpawnPoint> SelectSpawnPoints(int count)
|
||||||
|
{
|
||||||
|
// TODO: Fine-grained spawn selection
|
||||||
|
if (count > this.playerSpawnPoints.Count())
|
||||||
|
{
|
||||||
|
ConsoleScreen.Log($"[AKI PMC Bot spawn] Wanted ${count} but only {this.playerSpawnPoints.Count()} found, returning all");
|
||||||
|
return this.playerSpawnPoints;
|
||||||
|
}
|
||||||
|
return this.playerSpawnPoints.OrderBy(x => _rnd.Next()).Take(count).ToList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public class PMCBotSpawnLocationPatch : ModulePatch
|
||||||
|
{
|
||||||
|
protected override MethodBase GetTargetMethod()
|
||||||
|
{
|
||||||
|
return AccessTools.Method(typeof(BotSpawner), "TryToSpawnInZoneInner");
|
||||||
|
}
|
||||||
|
|
||||||
|
[PatchPrefix]
|
||||||
|
public static bool PatchPrefix(GClass1468 __instance, GClass588 data)
|
||||||
|
{
|
||||||
|
|
||||||
|
var firstBotRole = data.Profiles[0].Info.Settings.Role;
|
||||||
|
if ((int)firstBotRole != AkiBotsPrePatcher.sptBearValue || (int)firstBotRole != AkiBotsPrePatcher.sptUsecValue)
|
||||||
|
{
|
||||||
|
ConsoleScreen.Log("[AKI PMC Bot spawn] Spawning a set of Scavs. Skipping...");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
var helper = new SptSpawnHelper();
|
||||||
|
var newSpawns = helper.SelectSpawnPoints(data.Count);
|
||||||
|
|
||||||
|
for (int i = 0; i < data.Count; i++)
|
||||||
|
{
|
||||||
|
ConsoleScreen.Log($"[AKI PMC Bot spawn] Trying to spawn bot {i}");
|
||||||
|
var currentSpawnData = data.Separate(1);
|
||||||
|
|
||||||
|
// Unset group settings
|
||||||
|
// TODO: Allow for PMC bot groups?
|
||||||
|
currentSpawnData.SpawnParams.ShallBeGroup = null;
|
||||||
|
var spawnPointDetails = newSpawns[i];
|
||||||
|
var currentZone = __instance.GetClosestZone(spawnPointDetails.Position, out float _);
|
||||||
|
|
||||||
|
// CorePointId of player spawns seems to always be 0. Bots will not activate properly if this ID is used
|
||||||
|
// TODO: Verify if CorePointId of 1 is acceptable in all cases
|
||||||
|
|
||||||
|
ConsoleScreen.Log($"[AKI PMC Bot spawn] spawn point chosen: {spawnPointDetails.Name} Core point id was: {spawnPointDetails.CorePointId}");
|
||||||
|
currentSpawnData.AddPosition(spawnPointDetails.Position, spawnPointDetails.CorePointId);
|
||||||
|
|
||||||
|
__instance.SpawnBotsInZoneOnPositions(newSpawns.GetRange(i, 1), currentZone, currentSpawnData);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user