AmazingAlek f239acd724
cleanup after disconnected players (#62)
* * removed need for NetPlayer
* split JoinPlayer into JoinPlayer and LeavePlayer
* cleanup of player and ship in LeavePlayer

* null checks in anim mirror

* it kinda works

* resetting some more stuff when DCing

* cleaning up ship

* removed some unused code

* cleanup

* cleaning up all client owned objects

* resetting (mostly) anim stuff when leaving

* setting local instance on player transform sync right away

Co-authored-by: Ricardo Lopes <Raicuparta@users.noreply.github.com>
2020-03-07 16:42:43 +01:00

89 lines
2.9 KiB
C#

using UnityEngine;
using UnityEngine.Networking;
namespace QSB.TransformSync
{
public abstract class TransformSync : NetworkBehaviour
{
private const float SmoothTime = 0.1f;
private static bool _isAwake;
public Transform SyncedTransform { get; private set; }
private bool _isSectorSetUp;
private Vector3 _positionSmoothVelocity;
private Quaternion _rotationSmoothVelocity;
protected virtual void Awake()
{
DontDestroyOnLoad(this);
if (_isAwake)
{
OnWakeUp();
}
else
{
GlobalMessenger.AddListener("WakeUp", OnWakeUp);
}
}
protected abstract Transform InitLocalTransform();
protected abstract Transform InitRemoteTransform();
private void OnWakeUp()
{
_isAwake = true;
DebugLog.Screen("Start TransformSync", netId.Value);
Invoke(nameof(SetFirstSector), 1);
transform.parent = Locator.GetRootTransform();
SyncedTransform = hasAuthority ? InitLocalTransform() : InitRemoteTransform();
if (!hasAuthority)
{
SyncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;
}
}
private void SetFirstSector()
{
_isSectorSetUp = true;
SectorSync.Instance.SetSector(netId.Value, Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform);
}
public void EnterSector(Sector sector)
{
SectorSync.Instance.SetSector(netId.Value, sector.GetName());
}
private void Update()
{
if (!SyncedTransform || !_isSectorSetUp)
{
return;
}
var sectorTransform = SectorSync.Instance.GetSector(netId.Value);
if (hasAuthority)
{
transform.position = sectorTransform.InverseTransformPoint(SyncedTransform.position);
transform.rotation = sectorTransform.InverseTransformRotation(SyncedTransform.rotation);
}
else
{
if (SyncedTransform.position == Vector3.zero)
{
SyncedTransform.position = Locator.GetAstroObject(AstroObject.Name.Sun).transform.position;
}
else
{
SyncedTransform.parent = sectorTransform;
SyncedTransform.localPosition = Vector3.SmoothDamp(SyncedTransform.localPosition, transform.position, ref _positionSmoothVelocity, SmoothTime);
SyncedTransform.localRotation = QuaternionHelper.SmoothDamp(SyncedTransform.localRotation, transform.rotation, ref _rotationSmoothVelocity, Time.deltaTime);
}
}
}
}
}