2024-01-03 16:06:50 +00:00
using Aki.Reflection.Patching ;
using Comfort.Common ;
using EFT ;
using EFT.NextObservedPlayer ;
using EFT.UI ;
using EFT.Vehicle ;
using HarmonyLib ;
using System ;
using System.Reflection ;
namespace Aki.Debugging.BTR.Patches
{
// Fixes the BTR Bot initialization in AttachBot() of BTRTurretView
//
// Context:
// ClientGameWorld in LiveEFT will register the server-side BTR Bot as type ObservedPlayerView and is stored in GameWorld's allObservedPlayersByID dictionary.
// In SPT, GameWorld.allObservedPlayersByID is empty which results in the game never finishing the initialization of the BTR Bot which includes disabling its gun, voice and mesh renderers.
// For now, we do dirty patches to work around the lack of ObservedPlayerView, using Player instead.
2024-01-20 09:20:32 +00:00
internal class BTRBotAttachPatch : ModulePatch
2024-01-03 16:06:50 +00:00
{
protected override MethodBase GetTargetMethod ( )
{
return AccessTools . Method ( typeof ( BTRTurretView ) , nameof ( BTRTurretView . AttachBot ) ) ;
}
[PatchPrefix]
2024-01-20 09:20:32 +00:00
private static bool PatchPrefix ( BTRTurretView __instance , int btrBotId )
2024-01-03 16:06:50 +00:00
{
var gameWorld = Singleton < GameWorld > . Instance ;
2024-01-20 09:20:32 +00:00
var __instanceTupleField = ( ValueTuple < ObservedPlayerView , bool > ) AccessTools . Field ( __instance . GetType ( ) , "valueTuple_0" )
. GetValue ( __instance ) ;
2024-01-03 16:06:50 +00:00
2024-01-20 09:20:32 +00:00
if ( ! __instanceTupleField . Item2 )
2024-01-03 16:06:50 +00:00
{
2024-01-20 09:20:32 +00:00
var __instanceMethod = AccessTools . Method ( __instance . GetType ( ) , "method_1" ) ;
__instanceMethod . Invoke ( __instance , new object [ ] { btrBotId } ) ;
2024-01-03 16:06:50 +00:00
}
2024-01-20 09:20:32 +00:00
if ( ! __instanceTupleField . Item2 )
2024-01-03 16:06:50 +00:00
{
return false ;
}
var btrBot = gameWorld . BtrController . BotShooterBtr ? . GetPlayer ;
if ( btrBot = = null )
{
return false ;
}
try
{
2024-01-20 09:20:32 +00:00
var botRootTransform = __instance . BotRoot ;
2024-01-03 16:06:50 +00:00
btrBot . Transform . position = botRootTransform . position ;
2024-01-20 09:20:32 +00:00
var firearmController = btrBot . gameObject . GetComponent < Player . FirearmController > ( ) ;
var currentWeaponPrefab = ( WeaponPrefab ) AccessTools . Field ( firearmController . GetType ( ) , "weaponPrefab_0" ) . GetValue ( firearmController ) ;
2024-01-03 16:06:50 +00:00
currentWeaponPrefab . transform . position = botRootTransform . position ;
btrBot . PlayerBones . Weapon_Root_Anim . SetPositionAndRotation ( botRootTransform . position , botRootTransform . rotation ) ;
2024-01-04 08:51:06 +00:00
2024-01-03 16:06:50 +00:00
return false ;
}
catch
{
2024-01-04 08:51:06 +00:00
ConsoleScreen . LogError ( "[AKI-BTR]: Could not finish BtrBot initialization. Check logs." ) ;
2024-01-03 16:06:50 +00:00
throw ;
}
}
}
}