mirror of
https://github.com/sp-tarkov/modules.git
synced 2025-02-12 21:10: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:
parent
cd190061cf
commit
f10742586c
@ -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()
|
||||
|
35
project/SPT.Custom/BTR/CollisionDebugger.cs
Normal file
35
project/SPT.Custom/BTR/CollisionDebugger.cs
Normal 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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -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" />
|
||||
|
Loading…
x
Reference in New Issue
Block a user