Compare commits
2 Commits
6d7f9aa8c0
...
1fa8516ebe
| Author | SHA1 | Date | |
|---|---|---|---|
| 1fa8516ebe | |||
| 3dbe62a64d |
@@ -66,7 +66,7 @@ namespace BoneSync.Data
|
||||
Pool pool = GetPool(spawnableObject);
|
||||
if (pool == null)
|
||||
{
|
||||
SyncLogger.Warning("[SpawnPooleeAndMakeSyncable] Failed to find pool: " + spawnableObject.title);
|
||||
SyncLogger.Warning("Failed to find pool: " + spawnableObject.title);
|
||||
return null;
|
||||
}
|
||||
Poolee poolee = CallPatchedMethods.InstantiatePoolee(pool, position, rotation, pool.Prefab.transform.localScale);
|
||||
|
||||
@@ -116,7 +116,7 @@ namespace BoneSync
|
||||
IsConnected = lobby.IsConnected();
|
||||
transport.Tick();
|
||||
Packet.TryCatchup();
|
||||
PlayerRig.Tick();
|
||||
PlayerRig.Tick(Time.fixedDeltaTime);
|
||||
}
|
||||
|
||||
public override void OnLateUpdate()
|
||||
|
||||
@@ -28,7 +28,7 @@ namespace BoneSync.Networking.Messages
|
||||
public SimpleEventType eventType;
|
||||
public byte index;
|
||||
public byte length;
|
||||
//public object[] args;
|
||||
public byte[] extraData;
|
||||
}
|
||||
[PacketType(PacketType.SimpleObjectEventSync), PacketReliability(PacketReliability.ReliableFast), PacketCatchup(20)]
|
||||
public class SimpleSyncableEventMessage : NetworkMessage
|
||||
@@ -41,6 +41,12 @@ namespace BoneSync.Networking.Messages
|
||||
byteEncoder.WriteByte((byte)simpleSyncableEvent.eventType);
|
||||
byteEncoder.WriteByte(simpleSyncableEvent.index);
|
||||
byteEncoder.WriteByte(simpleSyncableEvent.length);
|
||||
if (simpleSyncableEvent.extraData == null)
|
||||
{
|
||||
simpleSyncableEvent.extraData = new byte[0];
|
||||
}
|
||||
byteEncoder.WriteByte((byte)simpleSyncableEvent.extraData.Length);
|
||||
byteEncoder.WriteBytes(simpleSyncableEvent.extraData);
|
||||
}
|
||||
|
||||
public SimpleSyncableEventMessage(Packet packet)
|
||||
@@ -50,6 +56,8 @@ namespace BoneSync.Networking.Messages
|
||||
eventData.eventType = (SimpleEventType)byteEncoder.ReadByte();
|
||||
eventData.index = byteEncoder.ReadByte();
|
||||
eventData.length = byteEncoder.ReadByte();
|
||||
ushort extraDataLength = byteEncoder.ReadByte();
|
||||
eventData.extraData = byteEncoder.ReadBytes(extraDataLength);
|
||||
}
|
||||
|
||||
public override void Execute()
|
||||
|
||||
@@ -55,11 +55,17 @@ namespace BoneSync.Player
|
||||
SyncLogger.Msg("Loaded playerRepBundle success");
|
||||
}
|
||||
|
||||
public static void Tick()
|
||||
public static void Tick(float deltaTime)
|
||||
{
|
||||
foreach (PlayerRig playerRig in _playerRigs.Values)
|
||||
{
|
||||
playerRig.UpdateIK();
|
||||
try {
|
||||
playerRig.UpdatePlayerTransforms(deltaTime);
|
||||
playerRig.UpdateIK(deltaTime);
|
||||
} catch (Exception e)
|
||||
{
|
||||
SyncLogger.Error("Error updating player rig for " + playerRig._ownerId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -78,15 +84,53 @@ namespace BoneSync.Player
|
||||
characterAnimationManager.ApplyFingerCurl(handedness, 1f - fingerCurl.thumb, 1f - fingerCurl.index, 1f - fingerCurl.middle, 1f - fingerCurl.ring, 1f - fingerCurl.pinky);
|
||||
}
|
||||
|
||||
private Vector3 _targetRootPos = Vector3.zero;
|
||||
|
||||
private Vector3 _targetHeadPos = Vector3.zero;
|
||||
private Quaternion _targetHeadRot = Quaternion.identity;
|
||||
|
||||
private Vector3 _targetLeftHandPos = Vector3.zero;
|
||||
private Quaternion _targetLeftHandRot = Quaternion.identity;
|
||||
|
||||
private Vector3 _targetRightHandPos = Vector3.zero;
|
||||
private Quaternion _targetRightHandRot = Quaternion.identity;
|
||||
|
||||
private void UpdatePlayerTransforms(float deltaTime)
|
||||
{
|
||||
float step = deltaTime * 5f; // smoothing factor
|
||||
|
||||
playerRig.transform.position = Vector3.Lerp(playerRig.transform.position, _targetRootPos, step);
|
||||
|
||||
headTransform.position = Vector3.Lerp(headTransform.position, _targetHeadPos, step);
|
||||
leftHandTransform.position = Vector3.Lerp(leftHandTransform.position, _targetLeftHandPos, step);
|
||||
rightHandTransform.position = Vector3.Lerp(rightHandTransform.position, _targetRightHandPos, step);
|
||||
|
||||
|
||||
headTransform.rotation = Quaternion.Lerp(headTransform.rotation, _targetHeadRot, step);
|
||||
leftHandTransform.rotation = Quaternion.Lerp(leftHandTransform.rotation, _targetLeftHandRot, step);
|
||||
rightHandTransform.rotation = Quaternion.Lerp(rightHandTransform.rotation, _targetRightHandRot, step);
|
||||
}
|
||||
|
||||
|
||||
public void UpdatePlayerSync(PlayerSyncInfo playerSyncInfo)
|
||||
{
|
||||
EnsurePlayerRig();
|
||||
//SyncLogger.Msg("Updating player sync for " + _ownerId);
|
||||
playerRig.transform.position = playerSyncInfo.rootPos;
|
||||
//playerRig.transform.position = playerSyncInfo.rootPos;
|
||||
_targetRootPos = playerSyncInfo.rootPos;
|
||||
|
||||
headTransform.ApplySimpleTransform(playerSyncInfo.headPos);
|
||||
leftHandTransform.ApplySimpleTransform(playerSyncInfo.leftHandPos);
|
||||
rightHandTransform.ApplySimpleTransform(playerSyncInfo.rightHandPos);
|
||||
_targetHeadRot = playerSyncInfo.headPos.rotation;
|
||||
_targetHeadPos = playerSyncInfo.headPos.position;
|
||||
|
||||
_targetLeftHandPos = playerSyncInfo.leftHandPos.position;
|
||||
_targetLeftHandRot = playerSyncInfo.leftHandPos.rotation;
|
||||
|
||||
_targetRightHandPos = playerSyncInfo.rightHandPos.position;
|
||||
_targetRightHandRot = playerSyncInfo.rightHandPos.rotation;
|
||||
|
||||
//headTransform.ApplySimpleTransform(playerSyncInfo.headPos);
|
||||
//leftHandTransform.ApplySimpleTransform(playerSyncInfo.leftHandPos);
|
||||
//rightHandTransform.ApplySimpleTransform(playerSyncInfo.rightHandPos);
|
||||
|
||||
SetFingerCurl(Handedness.LEFT, playerSyncInfo.leftHandFingerCurl);
|
||||
SetFingerCurl(Handedness.RIGHT, playerSyncInfo.rightHandFingerCurl);
|
||||
@@ -96,6 +140,8 @@ namespace BoneSync.Player
|
||||
|
||||
UpdatePoseRadius(Handedness.LEFT, playerSyncInfo.poseRadiusLeft);
|
||||
UpdatePoseRadius(Handedness.RIGHT, playerSyncInfo.poseRadiusRight);
|
||||
|
||||
UpdatePlayerTransforms( 1f / RIG_SYNC_FPS); // immediately update transforms to avoid lag
|
||||
}
|
||||
|
||||
public void UpdatePose(Handedness hand, int index)
|
||||
@@ -232,25 +278,18 @@ namespace BoneSync.Player
|
||||
|
||||
}
|
||||
|
||||
public void UpdateIK()
|
||||
public void UpdateIK(float deltaTime)
|
||||
{
|
||||
// Catch errors so other players arent broken
|
||||
try
|
||||
{
|
||||
if (body == null || characterAnimationManager == null || animator == null || playerRig == null) return;
|
||||
|
||||
if (body == null || characterAnimationManager == null || animator == null || playerRig == null) return;
|
||||
|
||||
animator.Update(Time.fixedDeltaTime);
|
||||
characterAnimationManager.OnLateUpdate();
|
||||
Vector3 repInputVel = Vector3.zero;
|
||||
animator.Update(deltaTime);
|
||||
characterAnimationManager.OnLateUpdate();
|
||||
Vector3 repInputVel = Vector3.zero;
|
||||
|
||||
body.FullBodyUpdate(repInputVel, Vector3.zero);
|
||||
body.ArtToBlender.UpdateBlender();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
SyncLogger.Warning("Failed to update player rig " + _ownerId);
|
||||
SyncLogger.Warning(e.ToString());
|
||||
}
|
||||
body.FullBodyUpdate(repInputVel, Vector3.zero);
|
||||
body.ArtToBlender.UpdateBlender();
|
||||
}
|
||||
|
||||
|
||||
@@ -263,7 +302,7 @@ namespace BoneSync.Player
|
||||
public static void OnPlayerSync(PlayerSyncMessage playerSyncMessage)
|
||||
{
|
||||
//SyncLogger.Msg("Player Sync Received " + playerSyncMessage.senderId);
|
||||
PlayerRig playerRig = PlayerRig.GetPlayerRig(playerSyncMessage.senderId);
|
||||
PlayerRig playerRig = GetPlayerRig(playerSyncMessage.senderId);
|
||||
if (playerRig == null) return;
|
||||
playerRig.UpdatePlayerSync(playerSyncMessage.playerSyncInfo);
|
||||
|
||||
|
||||
@@ -76,13 +76,13 @@ namespace BoneSync.Sync.Components
|
||||
get;
|
||||
}
|
||||
private ushort _syncId;
|
||||
private float _lastSyncTime;
|
||||
private float _lastObjectSyncTime;
|
||||
|
||||
private bool _isInHolster;
|
||||
private bool _attemptedRegister;
|
||||
|
||||
public bool Registered => _syncId != 0;
|
||||
public bool isStale => Time.realtimeSinceStartup - _lastSyncTime > 30f;
|
||||
public bool isStale => Time.realtimeSinceStartup - _lastObjectSyncTime > 30f;
|
||||
public bool isOwner => _ownerId == BoneSync.lobby.GetLocalId();
|
||||
|
||||
public bool isValid
|
||||
|
||||
@@ -20,7 +20,7 @@ namespace BoneSync.Sync.Components
|
||||
private Queue<byte[]> _simpleEventQueue = new Queue<byte[]>();
|
||||
private void SendObjectSync()
|
||||
{
|
||||
_lastSyncTime = Time.realtimeSinceStartup;
|
||||
_lastObjectSyncTime = Time.realtimeSinceStartup;
|
||||
ObjectSync.SendObjectSyncMessage(this);
|
||||
}
|
||||
private IEnumerator OwnerCoroutineAsync()
|
||||
@@ -164,11 +164,11 @@ namespace BoneSync.Sync.Components
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool AddSimpleEventToQueue(SimpleEventType eType, byte index = 0, byte len = 0)
|
||||
public bool AddSimpleEventToQueue(SimpleEventType eType, byte index = 0, byte len = 0, byte[] extraData = null)
|
||||
{
|
||||
RegisterSyncable();
|
||||
if (!isOwner && Registered) { return false; }
|
||||
_simpleEventQueue.Enqueue(new byte[] { (byte)eType, index, len });
|
||||
_simpleEventQueue.Enqueue(new byte[] { (byte)eType, index, len }.Concat(extraData ?? new byte[0]).ToArray());
|
||||
TryCatchUpSimpleEvents();
|
||||
return true;
|
||||
}
|
||||
@@ -184,11 +184,11 @@ namespace BoneSync.Sync.Components
|
||||
if (_simpleEventQueue.Count > 0 && Registered && isOwner)
|
||||
{
|
||||
byte[] eventData = _simpleEventQueue.Dequeue();
|
||||
_SendSimpleEvent((SimpleEventType)eventData[0], eventData[1], eventData[2]);
|
||||
_SendSimpleEvent((SimpleEventType)eventData[0], eventData[1], eventData[2], eventData.Skip(3).ToArray());
|
||||
TryCatchUpSimpleEvents();
|
||||
}
|
||||
}
|
||||
private void _SendSimpleEvent(SimpleEventType eType, byte index = 0, byte len = 0)
|
||||
private void _SendSimpleEvent(SimpleEventType eType, byte index = 0, byte len = 0, byte[] extraData = null)
|
||||
{
|
||||
SyncLogger.Msg("Sending simple event: " + eType);
|
||||
SimpleSyncableEvent data = new SimpleSyncableEvent()
|
||||
@@ -196,7 +196,8 @@ namespace BoneSync.Sync.Components
|
||||
syncId = _syncId,
|
||||
eventType = eType,
|
||||
index = index,
|
||||
length = len
|
||||
length = len,
|
||||
extraData = extraData
|
||||
};
|
||||
|
||||
SimpleSyncableEventMessage simpleSyncEvent = new SimpleSyncableEventMessage(data);
|
||||
|
||||
@@ -23,7 +23,10 @@ namespace BoneSync.Sync.Components
|
||||
{
|
||||
SyncLogger.Msg("ButtonToggle:" + eventType + " " + toggle.transform.GetPath());
|
||||
byte index = (byte)Array.IndexOf(buttonToggles, toggle);
|
||||
return AddSimpleEventToQueue(eventType, index, (byte)buttonToggles.Length);
|
||||
bool isPressed = toggle._isPressed;
|
||||
bool hasBeenPressed = toggle._hasBeenPressed;
|
||||
byte[] buttonState = BitPacking.PackBits(new bool[] { isPressed, hasBeenPressed });
|
||||
return AddSimpleEventToQueue(eventType, index, (byte)buttonToggles.Length, buttonState);
|
||||
}
|
||||
bool ButtonOnPress(ButtonToggle toggle)
|
||||
{
|
||||
@@ -144,7 +147,7 @@ namespace BoneSync.Sync.Components
|
||||
|
||||
public void ApplyObjectSyncTransforms(ObjectSyncTransform[] objectSyncTransforms)
|
||||
{
|
||||
_lastSyncTime = Time.realtimeSinceStartup;
|
||||
_lastObjectSyncTime = Time.realtimeSinceStartup;
|
||||
if (IsPlugged()) { return; }
|
||||
if (objectSyncTransforms.Length != rigidbodies.Length)
|
||||
{
|
||||
@@ -234,14 +237,32 @@ namespace BoneSync.Sync.Components
|
||||
if (len != eventData.length) { SyncLogger.Warning("ButtonPress length mismatch: " + len + " != " + eventData.length); }
|
||||
if (index < buttonToggles.Length)
|
||||
{
|
||||
buttonToggles[index]?.onPress.BypassPatchInvoke();
|
||||
ButtonToggle toggle = buttonToggles[index];
|
||||
if (toggle == null)
|
||||
{
|
||||
SyncLogger.Warning("ButtonToggle at index " + index + " is null");
|
||||
break;
|
||||
}
|
||||
bool[] buttonState = BitPacking.UnpackBits(eventData.extraData, 2);
|
||||
toggle._isPressed = buttonState[0];
|
||||
toggle._hasBeenPressed = buttonState[1];
|
||||
toggle.onPress.BypassPatchInvoke();
|
||||
}
|
||||
break;
|
||||
case SimpleEventType.OnButtonRelease:
|
||||
if (len != eventData.length) { SyncLogger.Warning("ButtonPress length mismatch: " + len + " != " + eventData.length); }
|
||||
if (index < buttonToggles.Length)
|
||||
{
|
||||
buttonToggles[index]?.onDepress.BypassPatchInvoke();
|
||||
ButtonToggle toggle = buttonToggles[index];
|
||||
if (toggle == null)
|
||||
{
|
||||
SyncLogger.Warning("ButtonToggle at index " + index + " is null");
|
||||
break;
|
||||
}
|
||||
bool[] buttonState = BitPacking.UnpackBits(eventData.extraData, 2);
|
||||
toggle._isPressed = buttonState[0];
|
||||
toggle._hasBeenPressed = buttonState[1];
|
||||
toggle.onDepress.BypassPatchInvoke();
|
||||
}
|
||||
break;
|
||||
case SimpleEventType.OnButtonOneShot:
|
||||
@@ -250,7 +271,16 @@ namespace BoneSync.Sync.Components
|
||||
}
|
||||
if (index < buttonToggles.Length)
|
||||
{
|
||||
buttonToggles[index]?.onPressOneShot.BypassPatchInvoke();
|
||||
ButtonToggle toggle = buttonToggles[index];
|
||||
if (toggle == null)
|
||||
{
|
||||
SyncLogger.Warning("ButtonToggle at index " + index + " is null");
|
||||
break;
|
||||
}
|
||||
bool[] buttonState = BitPacking.UnpackBits(eventData.extraData, 2);
|
||||
toggle._isPressed = buttonState[0];
|
||||
toggle._hasBeenPressed = buttonState[1];
|
||||
toggle.onPressOneShot.BypassPatchInvoke();
|
||||
}
|
||||
break;
|
||||
case SimpleEventType.CartGo:
|
||||
|
||||
Reference in New Issue
Block a user