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

Fixed BTR twerking on steep slopes (!142)

In the end, Kaeno's fix by changing the main client collider's layer to `HighPolyCollider` is the only way I could fix it.

Also made changes to avoid unnecessary physics collisions between other BTR colliders; these physics collisions can cause FPS drops especially for lower end PCs so this should provide a slight performance gain for them.

I left in the commented-out collision debugger script I made to log collisions in case it's useful for future debugging purposes.

Reviewed-on: SPT/Modules#142
Co-authored-by: Nympfonic <arys.steam@gmail.com>
Co-committed-by: Nympfonic <arys.steam@gmail.com>
This commit is contained in:
Nympfonic 2024-07-04 11:29:13 +00:00 committed by chomp
parent cd190061cf
commit f10742586c
3 changed files with 105 additions and 6 deletions

View File

@ -1,11 +1,12 @@
using SPT.Custom.BTR.Utils;
using SPT.SinglePlayer.Utils.TraderServices;
using Comfort.Common;
using Comfort.Common;
using EFT;
using EFT.InventoryLogic;
using EFT.UI;
using EFT.Vehicle;
using GPUInstancer;
using HarmonyLib;
using SPT.Custom.BTR.Utils;
using SPT.SinglePlayer.Utils.TraderServices;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
@ -229,6 +230,7 @@ namespace SPT.Custom.BTR
private void InitBtrBotService()
{
btrBotShooter = btrController.BotShooterBtr;
btrBotShooter.GetPlayer.GetComponent<Rigidbody>().detectCollisions = false; // disable rigidbody collisions with BTR bot
firearmController = btrBotShooter.GetComponent<Player.FirearmController>();
var weaponPrefab = (WeaponPrefab)AccessTools.Field(firearmController.GetType(), "weaponPrefab_0").GetValue(firearmController);
weaponSoundPlayer = weaponPrefab.GetComponent<WeaponSoundPlayer>();
@ -380,14 +382,74 @@ namespace SPT.Custom.BTR
// Initially we assumed there was a reason for this so it was left as is.
// Turns out disabling the server collider in favour of the client collider fixes the "BTR doing a wheelie" bug,
// while preventing the player from walking through the BTR.
// We also need to change the client collider's layer to HighPolyCollider due to unknown collisions that occur
// when going down a steep slope.
// Add collision debugger component to log collisions in the EFT Console
var clientColliders = btrClientSide.GetComponentsInChildren<Collider>(true);
//foreach (var collider in clientColliders)
//{
// collider.gameObject.AddComponent<CollisionDebugger>();
//}
var serverColliders = btrServerSide.GetComponentsInChildren<Collider>(true);
//foreach (var collider in serverColliders)
//{
// collider.gameObject.AddComponent<CollisionDebugger>();
//}
var clientRootCollider = clientColliders.First(x => x.gameObject.name == "Root");
// Retrieve all TerrainColliders
var terrainColliders = new List<TerrainCollider>();
foreach (GPUInstancerManager manager in GPUInstancerManager.activeManagerList)
{
if (manager.GetType() != typeof(GPUInstancerDetailManager))
{
continue;
}
var detailManager = (GPUInstancerDetailManager)manager;
if (detailManager.terrain == null)
{
continue;
}
terrainColliders.Add(detailManager.terrain.GetComponent<TerrainCollider>());
}
// Make the Root collider ignore collisions with TerrainColliders
foreach (var collider in terrainColliders)
{
Physics.IgnoreCollision(clientRootCollider, collider);
}
// Retrieve all wheel colliders on the serverside BTR
const string wheelColliderParentName = "BTR_82_wheel";
const string wheelColliderName = "Cylinder";
var serverWheelColliders = serverColliders
.Where(x => x.transform.parent.name.StartsWith(wheelColliderParentName) && x.gameObject.name.StartsWith(wheelColliderName))
.ToArray();
// Make the Root collider ignore collisions with the serverside BTR wheels
foreach (var collider in serverWheelColliders)
{
Physics.IgnoreCollision(clientRootCollider, collider);
}
// Enable clientside BTR collider and disable serverside BTR collider
const string exteriorColliderName = "BTR_82_exterior_COLLIDER";
var serverExteriorCollider = btrServerSide.GetComponentsInChildren<Collider>(true)
var serverExteriorCollider = serverColliders
.First(x => x.gameObject.name == exteriorColliderName);
var clientExteriorCollider = btrClientSide.GetComponentsInChildren<Collider>(true)
var clientExteriorCollider = clientColliders
.First(x => x.gameObject.name == exteriorColliderName);
serverExteriorCollider.gameObject.SetActive(false);
clientExteriorCollider.gameObject.SetActive(true);
clientExteriorCollider.gameObject.layer = LayerMask.NameToLayer("HighPolyCollider");
}
private void UpdateTarget()

View File

@ -0,0 +1,35 @@
using EFT.UI;
using UnityEngine;
namespace SPT.Custom.BTR
{
public class CollisionDebugger : MonoBehaviour
{
private int _resetFrame = 10;
private int _frame = 0;
private void Update()
{
_frame = (_frame + 1) % _resetFrame;
}
private void OnCollisionEnter(Collision collision)
{
foreach (var contact in collision.contacts)
{
ConsoleScreen.LogWarning($"Collision between {gameObject.name} and {contact.otherCollider.gameObject.name}");
}
}
private void OnCollisionStay(Collision collision)
{
if (_frame == 0)
{
foreach (var contact in collision.contacts)
{
ConsoleScreen.LogWarning($"Collision between {gameObject.name} and {contact.otherCollider.gameObject.name}");
}
}
}
}
}

View File

@ -25,8 +25,10 @@
<Reference Include="UnityEngine.AudioModule" HintPath="..\Shared\Managed\UnityEngine.AudioModule.dll" Private="False" />
<Reference Include="UnityEngine.CoreModule" HintPath="..\Shared\Managed\UnityEngine.CoreModule.dll" Private="False" />
<Reference Include="UnityEngine.IMGUIModule" HintPath="..\Shared\Managed\UnityEngine.IMGUIModule.dll" Private="False" />
<Reference Include="UnityEngine.ParticleSystemModule" HintPath="..\Shared\Managed\UnityEngine.ParticleSystemModule.dll" Private="false" />
<Reference Include="UnityEngine.ParticleSystemModule" HintPath="..\Shared\Managed\UnityEngine.ParticleSystemModule.dll" Private="False" />
<Reference Include="UnityEngine.PhysicsModule" HintPath="..\Shared\Managed\UnityEngine.PhysicsModule.dll" Private="False" />
<Reference Include="UnityEngine.TerrainModule" HintPath="..\Shared\Managed\UnityEngine.TerrainModule.dll" Private="False" />
<Reference Include="UnityEngine.TerrainPhysicsModule" HintPath="..\Shared\Managed\UnityEngine.TerrainPhysicsModule.dll" Private="False" />
<Reference Include="UnityEngine.TextRenderingModule" HintPath="..\Shared\Managed\UnityEngine.TextRenderingModule.dll" Private="False" />
<Reference Include="UnityEngine.UI" HintPath="..\Shared\Managed\UnityEngine.UI.dll" Private="False" />
<Reference Include="UnityEngine.UIModule" HintPath="..\Shared\Managed\UnityEngine.UIModule.dll" Private="False" />