mirror of
https://github.com/GTA-ASM/SanAndreasUnity
synced 2024-11-14 00:07:15 +00:00
use new approach to sync vehicles
This commit is contained in:
parent
d49ef04a30
commit
d0bd858cce
6 changed files with 67 additions and 124 deletions
|
@ -10,12 +10,13 @@ GameObject:
|
||||||
m_Component:
|
m_Component:
|
||||||
- component: {fileID: 8267877565696799342}
|
- component: {fileID: 8267877565696799342}
|
||||||
- component: {fileID: 6732552431618800415}
|
- component: {fileID: 6732552431618800415}
|
||||||
- component: {fileID: 459295042993608392}
|
|
||||||
- component: {fileID: 9183683351129218624}
|
- component: {fileID: 9183683351129218624}
|
||||||
|
- component: {fileID: 6154053831592577151}
|
||||||
- component: {fileID: 575085982327711637}
|
- component: {fileID: 575085982327711637}
|
||||||
- component: {fileID: 6891581410426086992}
|
- component: {fileID: 6891581410426086992}
|
||||||
- component: {fileID: 1742792654273641741}
|
- component: {fileID: 1742792654273641741}
|
||||||
- component: {fileID: 9038525027628313851}
|
- component: {fileID: 9038525027628313851}
|
||||||
|
- component: {fileID: 6804370665295485595}
|
||||||
m_Layer: 0
|
m_Layer: 0
|
||||||
m_Name: Vehicle
|
m_Name: Vehicle
|
||||||
m_TagString: Untagged
|
m_TagString: Untagged
|
||||||
|
@ -54,40 +55,6 @@ MonoBehaviour:
|
||||||
visible: 0
|
visible: 0
|
||||||
m_AssetId: abddce9c98c1ba5a992f109cfd8c5a5c
|
m_AssetId: abddce9c98c1ba5a992f109cfd8c5a5c
|
||||||
hasSpawned: 0
|
hasSpawned: 0
|
||||||
--- !u!114 &459295042993608392
|
|
||||||
MonoBehaviour:
|
|
||||||
m_ObjectHideFlags: 0
|
|
||||||
m_CorrespondingSourceObject: {fileID: 0}
|
|
||||||
m_PrefabInstance: {fileID: 0}
|
|
||||||
m_PrefabAsset: {fileID: 0}
|
|
||||||
m_GameObject: {fileID: 5841438317718401360}
|
|
||||||
m_Enabled: 1
|
|
||||||
m_EditorHideFlags: 0
|
|
||||||
m_Script: {fileID: 11500000, guid: 2f74aedd71d9a4f55b3ce499326d45fb, type: 3}
|
|
||||||
m_Name:
|
|
||||||
m_EditorClassIdentifier:
|
|
||||||
syncMode: 0
|
|
||||||
syncInterval: 0.05
|
|
||||||
clientAuthority: 0
|
|
||||||
sendInterval: 0.05
|
|
||||||
syncPosition: 1
|
|
||||||
syncRotation: 1
|
|
||||||
syncScale: 0
|
|
||||||
interpolatePosition: 1
|
|
||||||
interpolateRotation: 1
|
|
||||||
interpolateScale: 0
|
|
||||||
bufferTimeMultiplier: 1
|
|
||||||
bufferSizeLimit: 64
|
|
||||||
catchupThreshold: 4
|
|
||||||
catchupMultiplier: 0.1
|
|
||||||
onlySyncOnChange: 1
|
|
||||||
bufferResetMultiplier: 5
|
|
||||||
positionSensitivity: 0.01
|
|
||||||
rotationSensitivity: 0.01
|
|
||||||
scaleSensitivity: 0.01
|
|
||||||
showGizmos: 0
|
|
||||||
showOverlay: 0
|
|
||||||
overlayColor: {r: 0, g: 0, b: 0, a: 0.5}
|
|
||||||
--- !u!114 &9183683351129218624
|
--- !u!114 &9183683351129218624
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -102,6 +69,31 @@ MonoBehaviour:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
syncMode: 0
|
syncMode: 0
|
||||||
syncInterval: 0.05
|
syncInterval: 0.05
|
||||||
|
--- !u!114 &6154053831592577151
|
||||||
|
MonoBehaviour:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5841438317718401360}
|
||||||
|
m_Enabled: 1
|
||||||
|
m_EditorHideFlags: 0
|
||||||
|
m_Script: {fileID: 11500000, guid: 7810004c3617c05419e4e60874dc18a7, type: 3}
|
||||||
|
m_Name:
|
||||||
|
m_EditorClassIdentifier:
|
||||||
|
syncMode: 0
|
||||||
|
syncInterval: 0.05
|
||||||
|
m_transformToSync: {fileID: 8267877565696799342}
|
||||||
|
m_transformSyncParameters:
|
||||||
|
useSmoothDeltaTime: 1
|
||||||
|
clientUpdateType: 3
|
||||||
|
constantVelocityMultiplier: 1
|
||||||
|
lerpFactor: 30
|
||||||
|
useRigidBody: 0
|
||||||
|
visualize: 0
|
||||||
|
maxNumVisualizations: 10
|
||||||
|
visualizationScale: 0.2
|
||||||
|
snapshotLatency: 0.1
|
||||||
--- !u!114 &575085982327711637
|
--- !u!114 &575085982327711637
|
||||||
MonoBehaviour:
|
MonoBehaviour:
|
||||||
m_ObjectHideFlags: 0
|
m_ObjectHideFlags: 0
|
||||||
|
@ -240,3 +232,19 @@ MonoBehaviour:
|
||||||
m_EditorClassIdentifier:
|
m_EditorClassIdentifier:
|
||||||
componentsToDestroy:
|
componentsToDestroy:
|
||||||
- {fileID: 1742792654273641741}
|
- {fileID: 1742792654273641741}
|
||||||
|
--- !u!54 &6804370665295485595
|
||||||
|
Rigidbody:
|
||||||
|
m_ObjectHideFlags: 0
|
||||||
|
m_CorrespondingSourceObject: {fileID: 0}
|
||||||
|
m_PrefabInstance: {fileID: 0}
|
||||||
|
m_PrefabAsset: {fileID: 0}
|
||||||
|
m_GameObject: {fileID: 5841438317718401360}
|
||||||
|
serializedVersion: 2
|
||||||
|
m_Mass: 1
|
||||||
|
m_Drag: 0
|
||||||
|
m_AngularDrag: 0.05
|
||||||
|
m_UseGravity: 1
|
||||||
|
m_IsKinematic: 0
|
||||||
|
m_Interpolate: 0
|
||||||
|
m_Constraints: 0
|
||||||
|
m_CollisionDetection: 0
|
||||||
|
|
|
@ -153,7 +153,7 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
|
|
||||||
public Mirror.NetworkIdentity NetIdentity { get; private set; }
|
public Mirror.NetworkIdentity NetIdentity { get; private set; }
|
||||||
|
|
||||||
public Mirror.NetworkTransform NetTransform { get; private set; }
|
public Net.CustomNetworkTransform NetTransform { get; private set; }
|
||||||
|
|
||||||
List<Ped> m_lastPreparedPeds = new List<Ped>();
|
List<Ped> m_lastPreparedPeds = new List<Ped>();
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
private void Awake()
|
private void Awake()
|
||||||
{
|
{
|
||||||
this.NetIdentity = this.GetComponentOrThrow<Mirror.NetworkIdentity>();
|
this.NetIdentity = this.GetComponentOrThrow<Mirror.NetworkIdentity>();
|
||||||
this.NetTransform = this.GetComponent<Mirror.NetworkTransform>();
|
this.NetTransform = this.GetComponent<Net.CustomNetworkTransform>();
|
||||||
_props = new MaterialPropertyBlock();
|
_props = new MaterialPropertyBlock();
|
||||||
this.Awake_Damage();
|
this.Awake_Damage();
|
||||||
this.Awake_Radio();
|
this.Awake_Radio();
|
||||||
|
|
|
@ -21,14 +21,6 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
[SyncVar] float m_net_steering;
|
[SyncVar] float m_net_steering;
|
||||||
[SyncVar] float m_net_braking;
|
[SyncVar] float m_net_braking;
|
||||||
|
|
||||||
[SyncVar(hook = nameof(OnNetPositionChanged))]
|
|
||||||
Vector3 m_net_position;
|
|
||||||
|
|
||||||
[SyncVar(hook = nameof(OnNetRotationChanged))]
|
|
||||||
Quaternion m_net_rotation;
|
|
||||||
|
|
||||||
[SyncVar] Vector3 m_net_linearVelocity;
|
|
||||||
[SyncVar] Vector3 m_net_angularVelocity;
|
|
||||||
[SyncVar] float m_net_health;
|
[SyncVar] float m_net_health;
|
||||||
|
|
||||||
struct WheelSyncData
|
struct WheelSyncData
|
||||||
|
@ -104,6 +96,12 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
Destroy(wheelCollider);
|
Destroy(wheelCollider);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (VehicleManager.Instance.destroyRigidBodyOnClients)
|
||||||
|
{
|
||||||
|
if (m_vehicle.RigidBody != null)
|
||||||
|
Object.Destroy(m_vehicle.RigidBody);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -165,9 +163,6 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
|
|
||||||
private void Update()
|
private void Update()
|
||||||
{
|
{
|
||||||
// if syncvars are used for updating transform, then disable NetworkTransform, and vice versa
|
|
||||||
m_vehicle.NetTransform.enabled = !VehicleManager.Instance.syncVehicleTransformUsingSyncVars;
|
|
||||||
|
|
||||||
// update status of rigid body
|
// update status of rigid body
|
||||||
this.EnableOrDisableRigidBody();
|
this.EnableOrDisableRigidBody();
|
||||||
|
|
||||||
|
@ -221,10 +216,6 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
m_net_acceleration = m_vehicle.Accelerator;
|
m_net_acceleration = m_vehicle.Accelerator;
|
||||||
m_net_steering = m_vehicle.Steering;
|
m_net_steering = m_vehicle.Steering;
|
||||||
m_net_braking = m_vehicle.Braking;
|
m_net_braking = m_vehicle.Braking;
|
||||||
m_net_position = m_vehicle.RigidBody.position;
|
|
||||||
m_net_rotation = m_vehicle.RigidBody.rotation;
|
|
||||||
m_net_linearVelocity = m_vehicle.RigidBody.velocity;
|
|
||||||
m_net_angularVelocity = m_vehicle.RigidBody.angularVelocity;
|
|
||||||
m_net_health = m_vehicle.Health;
|
m_net_health = m_vehicle.Health;
|
||||||
|
|
||||||
// wheels
|
// wheels
|
||||||
|
@ -277,21 +268,6 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// position and rotation will be applied in syncvar hooks
|
|
||||||
|
|
||||||
// apply velocity on all clients
|
|
||||||
|
|
||||||
if (VehicleManager.Instance.syncLinearVelocity)
|
|
||||||
m_vehicle.RigidBody.velocity = m_net_linearVelocity;
|
|
||||||
else
|
|
||||||
m_vehicle.RigidBody.velocity = Vector3.zero;
|
|
||||||
|
|
||||||
if (VehicleManager.Instance.syncAngularVelocity)
|
|
||||||
m_vehicle.RigidBody.angularVelocity = m_net_angularVelocity;
|
|
||||||
else
|
|
||||||
m_vehicle.RigidBody.angularVelocity = Vector3.zero;
|
|
||||||
|
|
||||||
|
|
||||||
m_vehicle.Health = m_net_health;
|
m_vehicle.Health = m_net_health;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -327,37 +303,6 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
if (NetStatus.IsServer)
|
if (NetStatus.IsServer)
|
||||||
{
|
{
|
||||||
F.EnableRigidBody(m_vehicle.RigidBody);
|
F.EnableRigidBody(m_vehicle.RigidBody);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (VehicleManager.Instance.whenToDisableRigidBody.Matches(this.IsControlledByLocalPlayer,
|
|
||||||
!NetStatus.IsServer))
|
|
||||||
F.DisableRigidBody(m_vehicle.RigidBody);
|
|
||||||
else
|
|
||||||
F.EnableRigidBody(m_vehicle.RigidBody);
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnNetPositionChanged(Vector3 oldPos, Vector3 newPos)
|
|
||||||
{
|
|
||||||
if (NetStatus.IsServer)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (VehicleManager.Instance.syncVehicleTransformUsingSyncVars)
|
|
||||||
{
|
|
||||||
if (m_vehicle != null && m_vehicle.RigidBody != null)
|
|
||||||
m_vehicle.RigidBody.MovePosition(newPos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void OnNetRotationChanged(Quaternion oldRot, Quaternion newRot)
|
|
||||||
{
|
|
||||||
if (NetStatus.IsServer)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (VehicleManager.Instance.syncVehicleTransformUsingSyncVars)
|
|
||||||
{
|
|
||||||
if (m_vehicle != null && m_vehicle.RigidBody != null)
|
|
||||||
m_vehicle.RigidBody.MoveRotation(newRot);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,9 +18,8 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
|
|
||||||
public bool syncLinearVelocity = true;
|
public bool syncLinearVelocity = true;
|
||||||
public bool syncAngularVelocity = true;
|
public bool syncAngularVelocity = true;
|
||||||
public Utilities.WhenOnClient whenToDisableRigidBody = Utilities.WhenOnClient.OnlyOnOtherClients;
|
public bool destroyRigidBodyOnClients = true;
|
||||||
public bool syncPedTransformWhileInVehicle = false;
|
public bool syncPedTransformWhileInVehicle = false;
|
||||||
public bool syncVehicleTransformUsingSyncVars = false;
|
|
||||||
public bool controlInputOnLocalPlayer = true;
|
public bool controlInputOnLocalPlayer = true;
|
||||||
public bool controlWheelsOnLocalPlayer = true;
|
public bool controlWheelsOnLocalPlayer = true;
|
||||||
public bool destroyWheelCollidersOnClient = true;
|
public bool destroyWheelCollidersOnClient = true;
|
||||||
|
|
|
@ -6,7 +6,6 @@ using VConsts = SanAndreasUnity.Behaviours.Vehicles.VehiclePhysicsConstants;
|
||||||
|
|
||||||
namespace SanAndreasUnity.Behaviours.Vehicles
|
namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
{
|
{
|
||||||
[RequireComponent(typeof(Rigidbody))]
|
|
||||||
public partial class Vehicle
|
public partial class Vehicle
|
||||||
{
|
{
|
||||||
private Rigidbody _rigidBody;
|
private Rigidbody _rigidBody;
|
||||||
|
@ -21,7 +20,7 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
[Range(0, 1)]
|
[Range(0, 1)]
|
||||||
public float Braking = 1f;
|
public float Braking = 1f;
|
||||||
|
|
||||||
public Vector3 Velocity { get { return _rigidBody.velocity; } }
|
public Vector3 Velocity { get { return _rigidBody != null ? _rigidBody.velocity : Vector3.zero; } }
|
||||||
|
|
||||||
public float AverageWheelHeight { get { return _wheels.Count == 0 ? transform.position.y : _wheels.Average(x => x.Child.position.y); } }
|
public float AverageWheelHeight { get { return _wheels.Count == 0 ? transform.position.y : _wheels.Average(x => x.Child.position.y); } }
|
||||||
|
|
||||||
|
@ -72,13 +71,19 @@ namespace SanAndreasUnity.Behaviours.Vehicles
|
||||||
}
|
}
|
||||||
|
|
||||||
private void UpdateValues(VConsts vals)
|
private void UpdateValues(VConsts vals)
|
||||||
|
{
|
||||||
|
if (_rigidBody != null)
|
||||||
{
|
{
|
||||||
_rigidBody.drag = HandlingData.Drag * vals.DragScale;
|
_rigidBody.drag = HandlingData.Drag * vals.DragScale;
|
||||||
_rigidBody.mass = HandlingData.Mass * vals.MassScale;
|
_rigidBody.mass = HandlingData.Mass * vals.MassScale;
|
||||||
_rigidBody.centerOfMass = HandlingData.CentreOfMass;
|
_rigidBody.centerOfMass = HandlingData.CentreOfMass;
|
||||||
|
}
|
||||||
|
|
||||||
foreach (var wheel in _wheels)
|
foreach (var wheel in _wheels)
|
||||||
{
|
{
|
||||||
|
if (null == wheel.Collider)
|
||||||
|
continue;
|
||||||
|
|
||||||
var spring = wheel.Collider.suspensionSpring;
|
var spring = wheel.Collider.suspensionSpring;
|
||||||
|
|
||||||
spring.damper = HandlingData.SuspensionDampingLevel * vals.SuspensionDampingScale;
|
spring.damper = HandlingData.SuspensionDampingLevel * vals.SuspensionDampingScale;
|
||||||
|
|
|
@ -39,12 +39,6 @@ namespace SanAndreasUnity.Settings
|
||||||
setValue = (value) => { ApplyVehicleSyncRate(value); },
|
setValue = (value) => { ApplyVehicleSyncRate(value); },
|
||||||
persistType = OptionsWindow.InputPersistType.OnStart
|
persistType = OptionsWindow.InputPersistType.OnStart
|
||||||
};
|
};
|
||||||
OptionsWindow.BoolInput m_syncVehicleTransformUsingSyncVars = new OptionsWindow.BoolInput ("Sync vehicle transform using syncvars") {
|
|
||||||
isAvailable = () => VehicleManager.Instance != null,
|
|
||||||
getValue = () => VehicleManager.Instance.syncVehicleTransformUsingSyncVars,
|
|
||||||
setValue = (value) => { VehicleManager.Instance.syncVehicleTransformUsingSyncVars = value; },
|
|
||||||
persistType = OptionsWindow.InputPersistType.OnStart
|
|
||||||
};
|
|
||||||
OptionsWindow.BoolInput m_syncVehiclesLinearVelocity = new OptionsWindow.BoolInput ("Sync vehicle's linear velocity") {
|
OptionsWindow.BoolInput m_syncVehiclesLinearVelocity = new OptionsWindow.BoolInput ("Sync vehicle's linear velocity") {
|
||||||
isAvailable = () => VehicleManager.Instance != null,
|
isAvailable = () => VehicleManager.Instance != null,
|
||||||
getValue = () => VehicleManager.Instance.syncLinearVelocity,
|
getValue = () => VehicleManager.Instance.syncLinearVelocity,
|
||||||
|
@ -76,11 +70,11 @@ namespace SanAndreasUnity.Settings
|
||||||
setValue = (value) => { VehicleManager.Instance.controlInputOnLocalPlayer = value; },
|
setValue = (value) => { VehicleManager.Instance.controlInputOnLocalPlayer = value; },
|
||||||
persistType = OptionsWindow.InputPersistType.OnStart
|
persistType = OptionsWindow.InputPersistType.OnStart
|
||||||
};
|
};
|
||||||
OptionsWindow.EnumInput<WhenOnClient> m_whenToDisableVehiclesRigidBody = new OptionsWindow.EnumInput<WhenOnClient> () {
|
OptionsWindow.BoolInput m_destroyVehiclesRigidBodyOnClients = new OptionsWindow.BoolInput () {
|
||||||
description = "When to disable vehicle rigid body on clients",
|
description = "Destroy vehicle rigid body on clients",
|
||||||
isAvailable = () => VehicleManager.Instance != null,
|
isAvailable = () => VehicleManager.Instance != null,
|
||||||
getValue = () => VehicleManager.Instance.whenToDisableRigidBody,
|
getValue = () => VehicleManager.Instance.destroyRigidBodyOnClients,
|
||||||
setValue = (value) => { ApplyRigidBodyState(value); },
|
setValue = (value) => VehicleManager.Instance.destroyRigidBodyOnClients = value,
|
||||||
persistType = OptionsWindow.InputPersistType.OnStart
|
persistType = OptionsWindow.InputPersistType.OnStart
|
||||||
};
|
};
|
||||||
OptionsWindow.BoolInput m_syncPedTransformWhileInVehicle = new OptionsWindow.BoolInput ("Sync ped transform while in vehicle") {
|
OptionsWindow.BoolInput m_syncPedTransformWhileInVehicle = new OptionsWindow.BoolInput ("Sync ped transform while in vehicle") {
|
||||||
|
@ -111,13 +105,12 @@ namespace SanAndreasUnity.Settings
|
||||||
m_deadBodySyncRate,
|
m_deadBodySyncRate,
|
||||||
m_deadBodyInterpolationMode,
|
m_deadBodyInterpolationMode,
|
||||||
m_vehicleSyncRate,
|
m_vehicleSyncRate,
|
||||||
m_syncVehicleTransformUsingSyncVars,
|
|
||||||
m_syncVehiclesLinearVelocity,
|
m_syncVehiclesLinearVelocity,
|
||||||
m_syncVehiclesAngularVelocity,
|
m_syncVehiclesAngularVelocity,
|
||||||
m_controlWheelsOnLocalPlayer,
|
m_controlWheelsOnLocalPlayer,
|
||||||
m_destroyWheelCollidersOnClient,
|
m_destroyWheelCollidersOnClient,
|
||||||
m_controlVehicleInputOnLocalPlayer,
|
m_controlVehicleInputOnLocalPlayer,
|
||||||
m_whenToDisableVehiclesRigidBody,
|
m_destroyVehiclesRigidBodyOnClients,
|
||||||
m_vehicleRigidBodyInterpolationModeOnServer,
|
m_vehicleRigidBodyInterpolationModeOnServer,
|
||||||
m_vehicleRigidBodyInterpolationModeOnClient,
|
m_vehicleRigidBodyInterpolationModeOnClient,
|
||||||
m_syncPedTransformWhileInVehicle);
|
m_syncPedTransformWhileInVehicle);
|
||||||
|
@ -159,13 +152,6 @@ namespace SanAndreasUnity.Settings
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ApplyRigidBodyState(WhenOnClient when)
|
|
||||||
{
|
|
||||||
VehicleManager.Instance.whenToDisableRigidBody = when;
|
|
||||||
foreach (var v in Vehicle.AllVehicles)
|
|
||||||
v.GetComponent<VehicleController>().EnableOrDisableRigidBody();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ApplyRigidBodyInterpolationModeOnServer(RigidbodyInterpolation interpolation)
|
static void ApplyRigidBodyInterpolationModeOnServer(RigidbodyInterpolation interpolation)
|
||||||
{
|
{
|
||||||
VehicleManager.Instance.rigidbodyInterpolationOnServer = interpolation;
|
VehicleManager.Instance.rigidbodyInterpolationOnServer = interpolation;
|
||||||
|
|
Loading…
Reference in a new issue