From a0286c3c7484d4bd7458916292457e6fb0db8379 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 18 Jun 2021 22:38:32 +0100 Subject: [PATCH 1/3] fix ones in QSB --- .../NPC/Patches/CharacterAnimationPatches.cs | 5 ++ .../QSBCharacterAnimController.cs | 2 + QSB/Animation/Player/AnimationSync.cs | 8 +++ QSB/Animation/Player/AnimatorMirror.cs | 7 +++ QSB/Animation/Player/CrouchSync.cs | 3 + .../Player/Events/AnimationTriggerEvent.cs | 1 + .../Player/Events/ChangeAnimTypeEvent.cs | 1 + .../Player/Patches/PlayerAnimationPatches.cs | 8 +++ .../Player/PlayerHeadRotationSync.cs | 3 + .../RemoteThrusterFlameController.cs | 3 + .../Thrusters/RemoteThrusterWashController.cs | 2 + QSB/CampfireSync/Patches/CampfirePatches.cs | 1 + QSB/ConversationSync/ConversationManager.cs | 3 + .../Events/ConversationEvent.cs | 2 + .../Events/DialogueConditionEvent.cs | 1 + .../Patches/ConversationPatches.cs | 3 + QSB/DeathSync/Patches/DeathPatches.cs | 3 + QSB/DeathSync/RespawnOnDeath.cs | 2 + QSB/Events/QSBEvent.cs | 1 + QSB/Events/QSBEventManager.cs | 7 +++ QSB/GeyserSync/Events/GeyserEvent.cs | 1 + QSB/GeyserSync/WorldObjects/QSBGeyser.cs | 1 + QSB/Instruments/InstrumentsManager.cs | 4 ++ QSB/Instruments/QSBCamera/CameraController.cs | 2 + QSB/Instruments/QSBCamera/CameraManager.cs | 7 ++- QSB/ItemSync/Events/MoveToCarryEvent.cs | 1 + QSB/ItemSync/Events/SocketItemEvent.cs | 1 + QSB/ItemSync/ItemManager.cs | 4 ++ QSB/ItemSync/Patches/ItemPatches.cs | 3 + QSB/ItemSync/WorldObjects/QSBOWItem.cs | 4 +- QSB/LogSync/Events/RevealFactEvent.cs | 2 + QSB/LogSync/Patches/LogPatches.cs | 1 + QSB/Messaging/MessageHandler.cs | 3 + QSB/OrbSync/Events/OrbUserEvent.cs | 9 +++ QSB/OrbSync/OrbManager.cs | 1 + QSB/OrbSync/Patches/OrbPatches.cs | 5 ++ .../TransformSync/NomaiOrbTransformSync.cs | 3 + QSB/OrbSync/WorldObjects/QSBOrbSlot.cs | 2 + QSB/Patches/QSBPatch.cs | 3 + QSB/Player/Events/PlayerEntangledEvent.cs | 2 + QSB/Player/Events/PlayerJoinEvent.cs | 1 + QSB/Player/Events/PlayerKickEvent.cs | 3 + QSB/Player/PlayerEntanglementWatcher.cs | 2 + QSB/Player/PlayerHUDMarker.cs | 3 + QSB/Player/PlayerInfo.cs | 1 + QSB/Player/PlayerMapMarker.cs | 2 + QSB/Player/QSBPlayerManager.cs | 7 +++ .../CustomNomaiRemoteCameraPlatform.cs | 59 ++++++++++++++++++- QSB/PoolSync/PoolManager.cs | 2 + QSB/ProbeSync/QSBProbe.cs | 1 + QSB/QSBCore.cs | 3 +- QSB/QSBNetworkManager.cs | 3 + QSB/QSBSceneManager.cs | 1 + .../Events/MoonStateChangeEvent.cs | 4 ++ .../Events/MultiStateChangeEvent.cs | 3 + QSB/QuantumSync/Events/QuantumShuffleEvent.cs | 1 + .../Events/SocketStateChangeEvent.cs | 2 + QSB/QuantumSync/Patches/QuantumPatches.cs | 14 ++++- .../Patches/QuantumVisibilityPatches.cs | 2 + .../Patches/ServerQuantumPatches.cs | 16 +++++ QSB/QuantumSync/QuantumManager.cs | 6 ++ .../QSBMultiStateQuantumObject.cs | 2 + .../WorldObjects/QSBQuantumObject.cs | 11 ++++ .../WorldObjects/QSBSocketedQuantumObject.cs | 1 + .../Events/EnterExitRoastingEvent.cs | 3 + .../Events/MarshmallowEventEvent.cs | 4 ++ QSB/RoastingSync/Patches/RoastingPatches.cs | 3 + QSB/RoastingSync/QSBMarshmallow.cs | 5 ++ QSB/SectorSync/QSBSectorManager.cs | 5 ++ QSB/SectorSync/SectorSync.cs | 8 +++ QSB/SectorSync/WorldObjects/QSBSector.cs | 3 + QSB/ShipSync/Events/FlyShipEvent.cs | 1 + QSB/ShipSync/Patches/ShipPatches.cs | 3 + QSB/ShipSync/ShipManager.cs | 2 + QSB/StatueSync/Patches/StatuePatches.cs | 2 + QSB/Syncs/IntermediaryTransform.cs | 3 + .../RigidbodySync/SectoredRigidbodySync.cs | 3 + .../UnparentedBaseRigidbodySync.cs | 6 ++ QSB/Syncs/TransformSync/BaseTransformSync.cs | 8 +++ .../TransformSync/SectoredTransformSync.cs | 3 + .../UnparentedBaseTransformSync.cs | 4 ++ QSB/TimeSync/TimeSyncUI.cs | 2 + QSB/TimeSync/WakeUpSync.cs | 9 +++ QSB/Tools/QSBFlashlight.cs | 6 ++ QSB/Tools/QSBTool.cs | 1 + .../Events/SetAsTranslatedEvent.cs | 1 + QSB/TranslationSync/Patches/SpiralPatches.cs | 3 + .../WorldObjects/QSBComputer.cs | 2 + .../WorldObjects/QSBVesselComputer.cs | 1 + .../WorldObjects/QSBWallText.cs | 1 + .../CustomRelativisticParticleSystem.cs | 2 + QSB/Utility/DebugActions.cs | 3 + QSB/Utility/DebugBoxManager.cs | 1 + QSB/Utility/DebugLog.cs | 1 + QSB/Utility/GlobalMessenger4Args.cs | 3 + QSB/Utility/GlobalMessenger5Args.cs | 3 + QSB/Utility/GlobalMessenger6Args.cs | 3 + QSB/Utility/RepeatingManager.cs | 2 + QSB/Utility/ZOverride.cs | 2 + QSB/WorldSync/QSBWorldSync.cs | 14 +++++ QSB/WorldSync/WorldObjectManager.cs | 1 + 101 files changed, 397 insertions(+), 5 deletions(-) diff --git a/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs b/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs index 4f293159..59003661 100644 --- a/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs +++ b/QSB/Animation/NPC/Patches/CharacterAnimationPatches.cs @@ -127,6 +127,7 @@ namespace QSB.Animation.NPC.Patches DebugLog.ToConsole($"Error - No player talking to {____dialogueTree.name}!", MessageType.Error); return false; } + var player = QSBPlayerManager.GetPlayer(playerId); var distance = player.Body.transform.position - __instance.transform.position; @@ -147,6 +148,7 @@ namespace QSB.Animation.NPC.Patches { return true; } + var id = QSBWorldSync.GetIdFromTypeSubset(ownerOfThis); QSBEventManager.FireEvent(EventNames.QSBNpcAnimEvent, AnimationEvent.StartConversation, id); return true; @@ -160,6 +162,7 @@ namespace QSB.Animation.NPC.Patches { return true; } + var id = QSBWorldSync.GetIdFromTypeSubset(ownerOfThis); QSBEventManager.FireEvent(EventNames.QSBNpcAnimEvent, AnimationEvent.EndConversation, id); return true; @@ -175,12 +178,14 @@ namespace QSB.Animation.NPC.Patches { return true; } + var qsbObj = QSBWorldSync.GetWorldObjects().First(x => x.GetDialogueTree() == ____dialogueTree); if (!____throwingRock && !qsbObj.InConversation() && Time.time > ____nextThrowTime) { __instance.GetType().GetMethod("StartRockThrow", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null); } + return false; } } diff --git a/QSB/Animation/NPC/WorldObjects/QSBCharacterAnimController.cs b/QSB/Animation/NPC/WorldObjects/QSBCharacterAnimController.cs index 3e129a47..150d0493 100644 --- a/QSB/Animation/NPC/WorldObjects/QSBCharacterAnimController.cs +++ b/QSB/Animation/NPC/WorldObjects/QSBCharacterAnimController.cs @@ -17,6 +17,7 @@ namespace QSB.Animation.NPC.WorldObjects { return; } + _playersInHeadZone.Add(player); } @@ -26,6 +27,7 @@ namespace QSB.Animation.NPC.WorldObjects { return; } + _playersInHeadZone.Remove(player); } diff --git a/QSB/Animation/Player/AnimationSync.cs b/QSB/Animation/Player/AnimationSync.cs index 1d2c02a5..7dd2a45b 100644 --- a/QSB/Animation/Player/AnimationSync.cs +++ b/QSB/Animation/Player/AnimationSync.cs @@ -64,6 +64,7 @@ namespace QSB.Animation.Player { LoadControllers(); } + NetworkAnimator.enabled = true; VisibleAnimator = body.GetComponent(); Mirror = body.gameObject.AddComponent(); @@ -158,11 +159,13 @@ namespace QSB.Animation.Player { return; } + if (state) { SuitUp(); return; } + SuitDown(); } @@ -172,15 +175,18 @@ namespace QSB.Animation.Player { return; } + CurrentType = type; if (_unsuitedAnimController == null) { DebugLog.ToConsole($"Error - Unsuited controller is null. ({PlayerId})", MessageType.Error); } + if (_suitedAnimController == null) { DebugLog.ToConsole($"Error - Suited controller is null. ({PlayerId})", MessageType.Error); } + RuntimeAnimatorController controller = default; switch (type) { @@ -216,6 +222,7 @@ namespace QSB.Animation.Player controller = _riebeckController; break; } + InvisibleAnimator.runtimeAnimatorController = controller; VisibleAnimator.runtimeAnimatorController = controller; if (type != AnimationType.PlayerSuited && type != AnimationType.PlayerUnsuited) @@ -229,6 +236,7 @@ namespace QSB.Animation.Player VisibleAnimator.SetTrigger("Grounded"); InvisibleAnimator.SetTrigger("Grounded"); } + NetworkAnimator.animator = InvisibleAnimator; // Probably not needed. Mirror.RebuildFloatParams(); for (var i = 0; i < InvisibleAnimator.parameterCount; i++) diff --git a/QSB/Animation/Player/AnimatorMirror.cs b/QSB/Animation/Player/AnimatorMirror.cs index bea0baf6..08299aa3 100644 --- a/QSB/Animation/Player/AnimatorMirror.cs +++ b/QSB/Animation/Player/AnimatorMirror.cs @@ -21,15 +21,18 @@ namespace QSB.Animation.Player { DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"from\".", MessageType.Error); } + if (to == null) { DebugLog.ToConsole($"Error - Trying to init AnimatorMirror with null \"to\".", MessageType.Error); } + if (to == null || from == null) { // Doing the return this way so you can see if one or both are null return; } + _from = from; _to = to; if (_from.runtimeAnimatorController == null) @@ -40,6 +43,7 @@ namespace QSB.Animation.Player { _to.runtimeAnimatorController = _from.runtimeAnimatorController; } + foreach (var param in _from.parameters.Where(p => p.type == AnimatorControllerParameterType.Float)) { _floatParams.Add(param.name, new AnimFloatParam()); @@ -52,10 +56,12 @@ namespace QSB.Animation.Player { return; } + if (_to.runtimeAnimatorController != _from.runtimeAnimatorController) { _to.runtimeAnimatorController = _from.runtimeAnimatorController; } + SyncParams(); SmoothFloats(); } @@ -73,6 +79,7 @@ namespace QSB.Animation.Player RebuildFloatParams(); break; } + _floatParams[fromParam.name].Target = _from.GetFloat(fromParam.name); break; diff --git a/QSB/Animation/Player/CrouchSync.cs b/QSB/Animation/Player/CrouchSync.cs index 98b1aa99..47e2a233 100644 --- a/QSB/Animation/Player/CrouchSync.cs +++ b/QSB/Animation/Player/CrouchSync.cs @@ -30,6 +30,7 @@ namespace QSB.Animation.Player SyncLocalCrouch(); return; } + SyncRemoteCrouch(); } @@ -39,6 +40,7 @@ namespace QSB.Animation.Player { return; } + var jumpChargeFraction = _playerController.GetJumpChargeFraction(); _crouchValue = jumpChargeFraction; } @@ -49,6 +51,7 @@ namespace QSB.Animation.Player { return; } + CrouchParam.Target = _crouchValue; CrouchParam.Smooth(CrouchSmoothTime); var jumpChargeFraction = CrouchParam.Current; diff --git a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs index b84781a8..4a99cd32 100644 --- a/QSB/Animation/Player/Events/AnimationTriggerEvent.cs +++ b/QSB/Animation/Player/Events/AnimationTriggerEvent.cs @@ -26,6 +26,7 @@ namespace QSB.Animation.Player.Events { return; } + animationSync.VisibleAnimator.SetTrigger(message.Name); } } diff --git a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs index a4071209..d7ec029d 100644 --- a/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs +++ b/QSB/Animation/Player/Events/ChangeAnimTypeEvent.cs @@ -26,6 +26,7 @@ namespace QSB.Animation.Player.Events { return; } + QSBPlayerManager.GetPlayer(message.AboutId).AnimationSync.SetAnimationType(message.EnumValue); QSBPlayerManager.GetSyncObject(message.AboutId).CheckInstrumentProps(message.EnumValue); } diff --git a/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs b/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs index 5178d6c4..ffdacd8f 100644 --- a/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs +++ b/QSB/Animation/Player/Patches/PlayerAnimationPatches.cs @@ -37,18 +37,22 @@ namespace QSB.Animation.Patches { movementVector = ____playerController.GetRelativeGroundVelocity(); } + if (Mathf.Abs(movementVector.x) < 0.05f) { movementVector.x = 0f; } + if (Mathf.Abs(movementVector.z) < 0.05f) { movementVector.z = 0f; } + if (isFlying) { ____ungroundedTime = Time.time; } + var freefallMagnitude = 0f; var timeInFreefall = 0f; var lastGroundBody = ____playerController.GetLastGroundBody(); @@ -57,6 +61,7 @@ namespace QSB.Animation.Patches freefallMagnitude = (____playerController.GetAttachedOWRigidbody(false).GetVelocity() - lastGroundBody.GetPointVelocity(____playerController.transform.position)).magnitude; timeInFreefall = Time.time - ____ungroundedTime; } + ____animator.SetFloat("RunSpeedX", movementVector.x / 3f); ____animator.SetFloat("RunSpeedY", movementVector.z / 3f); ____animator.SetFloat("TurnSpeed", ____playerController.GetTurning()); @@ -79,6 +84,7 @@ namespace QSB.Animation.Patches QSBEventManager.FireEvent(EventNames.QSBAnimTrigger, playerAnimationSync.AttachedNetId, "Land"); } } + if (isGrounded) { var leftFootLift = ____animator.GetFloat("LeftFootLift"); @@ -92,6 +98,7 @@ namespace QSB.Animation.Patches ____leftFootGrounded = false; QSBWorldSync.RaiseEvent(__instance, "OnLeftFootLift"); } + var rightFootLift = ____animator.GetFloat("RightFootLift"); if (!____rightFootGrounded && rightFootLift < 0.333f) { @@ -104,6 +111,7 @@ namespace QSB.Animation.Patches QSBWorldSync.RaiseEvent(__instance, "OnRightFootLift"); } } + ____justBecameGrounded = false; ____justTookFallDamage = false; var usingTool = Locator.GetToolModeSwapper().GetToolMode() != ToolMode.None; diff --git a/QSB/Animation/Player/PlayerHeadRotationSync.cs b/QSB/Animation/Player/PlayerHeadRotationSync.cs index e85101ac..0d76145e 100644 --- a/QSB/Animation/Player/PlayerHeadRotationSync.cs +++ b/QSB/Animation/Player/PlayerHeadRotationSync.cs @@ -23,16 +23,19 @@ namespace QSB.Animation.Player { return; } + if (_attachedAnimator == null) { DebugLog.ToConsole($"Error - _attachedAnimator is null!", MessageType.Error); return; } + if (_lookBase == null) { DebugLog.ToConsole($"Error - _lookBase is null!", MessageType.Error); return; } + var bone = _attachedAnimator.GetBoneTransform(HumanBodyBones.Head); // Get the camera's local rotation with respect to the player body var lookLocalRotation = Quaternion.Inverse(_attachedAnimator.transform.rotation) * _lookBase.rotation; diff --git a/QSB/Animation/Player/Thrusters/RemoteThrusterFlameController.cs b/QSB/Animation/Player/Thrusters/RemoteThrusterFlameController.cs index b0639337..cd51091e 100644 --- a/QSB/Animation/Player/Thrusters/RemoteThrusterFlameController.cs +++ b/QSB/Animation/Player/Thrusters/RemoteThrusterFlameController.cs @@ -61,17 +61,20 @@ namespace QSB.Animation.Player.Thrusters { num *= _belowMaxThrustScalar; } + _currentScale = _scaleSpring.Update(_currentScale, num, Time.deltaTime); if (_currentScale < 0f) { _currentScale = 0f; _scaleSpring.ResetVelocity(); } + if (_currentScale <= 0.001f) { _currentScale = 0f; _scaleSpring.ResetVelocity(); } + transform.localScale = Vector3.one * _currentScale; _light.range = _baseLightRadius * _currentScale; _thrusterRenderer.enabled = _currentScale > 0f; diff --git a/QSB/Animation/Player/Thrusters/RemoteThrusterWashController.cs b/QSB/Animation/Player/Thrusters/RemoteThrusterWashController.cs index fb1d1b28..8ed0dc9c 100644 --- a/QSB/Animation/Player/Thrusters/RemoteThrusterWashController.cs +++ b/QSB/Animation/Player/Thrusters/RemoteThrusterWashController.cs @@ -36,6 +36,7 @@ namespace QSB.Animation.Player.Thrusters DebugLog.ToConsole($"Error - DefaultParticleSystem is null!", OWML.Common.MessageType.Error); return; } + _defaultMainModule = _defaultParticleSystem.main; _defaultEmissionModule = _defaultParticleSystem.emission; _baseDefaultEmissionRate = _defaultEmissionModule.rateOverTime.constant; @@ -73,6 +74,7 @@ namespace QSB.Animation.Player.Thrusters { _defaultParticleSystem.Play(); } + _defaultEmissionModule.rateOverTimeMultiplier = _baseDefaultEmissionRate * emissionThrusterScale; _defaultParticleSystem.transform.SetPositionAndRotation(position, rotation); if (_defaultMainModule.customSimulationSpace != hitInfo.transform) diff --git a/QSB/CampfireSync/Patches/CampfirePatches.cs b/QSB/CampfireSync/Patches/CampfirePatches.cs index bbe11459..7914fb5b 100644 --- a/QSB/CampfireSync/Patches/CampfirePatches.cs +++ b/QSB/CampfireSync/Patches/CampfirePatches.cs @@ -24,6 +24,7 @@ namespace QSB.CampfireSync.Patches QSBEventManager.FireEvent(EventNames.QSBCampfireState, qsbCampfire.ObjectId, Campfire.State.LIT); Locator.GetFlashlight().TurnOff(false); } + return false; } } diff --git a/QSB/ConversationSync/ConversationManager.cs b/QSB/ConversationSync/ConversationManager.cs index 9a68577d..fc188d46 100644 --- a/QSB/ConversationSync/ConversationManager.cs +++ b/QSB/ConversationSync/ConversationManager.cs @@ -30,6 +30,7 @@ namespace QSB.ConversationSync { DebugLog.ToConsole("Error - Font is null!", MessageType.Error); } + _boxPrefab.GetComponent().font = font; _boxPrefab.GetComponent().color = Color.white; } @@ -52,6 +53,7 @@ namespace QSB.ConversationSync DebugLog.ToConsole("Warning - Tried to send conv. event with char id -1.", MessageType.Warning); return; } + QSBEventManager.FireEvent(EventNames.QSBConversation, (uint)id, text, ConversationType.Character); } @@ -68,6 +70,7 @@ namespace QSB.ConversationSync DebugLog.ToConsole("Warning - Tried to send conv. start/end event with char id -1.", MessageType.Warning); return; } + QSBEventManager.FireEvent(EventNames.QSBConversationStartEnd, charId, QSBPlayerManager.LocalPlayerId, state); } diff --git a/QSB/ConversationSync/Events/ConversationEvent.cs b/QSB/ConversationSync/Events/ConversationEvent.cs index 29e5775b..d60a1d76 100644 --- a/QSB/ConversationSync/Events/ConversationEvent.cs +++ b/QSB/ConversationSync/Events/ConversationEvent.cs @@ -28,6 +28,7 @@ namespace QSB.ConversationSync.Events { return; } + switch (message.EnumValue) { case ConversationType.Character: @@ -45,6 +46,7 @@ namespace QSB.ConversationSync.Events { break; } + var tree = QSBWorldSync.OldDialogueTrees[message.ObjectId]; UnityEngine.Object.Destroy(ConversationManager.Instance.BoxMappings[tree]); break; diff --git a/QSB/ConversationSync/Events/DialogueConditionEvent.cs b/QSB/ConversationSync/Events/DialogueConditionEvent.cs index 8a4f530e..c1380ff4 100644 --- a/QSB/ConversationSync/Events/DialogueConditionEvent.cs +++ b/QSB/ConversationSync/Events/DialogueConditionEvent.cs @@ -33,6 +33,7 @@ namespace QSB.ConversationSync.Events { QSBWorldSync.SetDialogueCondition(message.ConditionName, message.ConditionState); } + DialogueConditionManager.SharedInstance.SetConditionState(message.ConditionName, message.ConditionState); } } diff --git a/QSB/ConversationSync/Patches/ConversationPatches.cs b/QSB/ConversationSync/Patches/ConversationPatches.cs index 10349b5e..ba948aa2 100644 --- a/QSB/ConversationSync/Patches/ConversationPatches.cs +++ b/QSB/ConversationSync/Patches/ConversationPatches.cs @@ -26,6 +26,7 @@ namespace QSB.ConversationSync.Patches { DebugLog.ToConsole($"Warning - Index for tree {__instance.name} was -1.", MessageType.Warning); } + QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId = index; ConversationManager.Instance.SendConvState(index, true); } @@ -36,11 +37,13 @@ namespace QSB.ConversationSync.Patches { return false; } + if (QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId == -1) { DebugLog.ToConsole($"Warning - Ending conversation with CurrentDialogueId of -1! Called from {__instance.name}", MessageType.Warning); return true; } + ConversationManager.Instance.SendConvState(QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId, false); ConversationManager.Instance.CloseBoxCharacter(QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId); QSBPlayerManager.LocalPlayer.CurrentCharacterDialogueTreeId = -1; diff --git a/QSB/DeathSync/Patches/DeathPatches.cs b/QSB/DeathSync/Patches/DeathPatches.cs index 4b753c03..7637499f 100644 --- a/QSB/DeathSync/Patches/DeathPatches.cs +++ b/QSB/DeathSync/Patches/DeathPatches.cs @@ -60,6 +60,7 @@ namespace QSB.DeathSync.Patches impact.otherCollider.attachedRigidbody.gameObject.name })); } + return false; } @@ -127,6 +128,7 @@ namespace QSB.DeathSync.Patches })); } } + return false; } @@ -159,6 +161,7 @@ namespace QSB.DeathSync.Patches { ____dieNextUpdate = true; } + DebugLog.DebugWrite(string.Concat(new object[] { "HIGH SPEED IMPACT: ", diff --git a/QSB/DeathSync/RespawnOnDeath.cs b/QSB/DeathSync/RespawnOnDeath.cs index fb7cb6d5..b8573cb6 100644 --- a/QSB/DeathSync/RespawnOnDeath.cs +++ b/QSB/DeathSync/RespawnOnDeath.cs @@ -55,6 +55,7 @@ namespace QSB.DeathSync DebugLog.ToConsole($"Warning - Init() ran when ship was null?", MessageType.Warning); return; } + _shipComponents = shipTransform.GetComponentsInChildren(); _hatchController = shipTransform.GetComponentInChildren(); _cockpitController = shipTransform.GetComponentInChildren(); @@ -172,6 +173,7 @@ namespace QSB.DeathSync DebugLog.ToConsole($"Warning - _spawnList was null for player spawner!", MessageType.Warning); return null; } + return spawnList.FirstOrDefault(spawnPoint => spawnPoint.GetSpawnLocation() == SpawnLocation.TimberHearth && spawnPoint.IsShipSpawn() == isShip); diff --git a/QSB/Events/QSBEvent.cs b/QSB/Events/QSBEvent.cs index 4f16c4b6..b4341fcf 100644 --- a/QSB/Events/QSBEvent.cs +++ b/QSB/Events/QSBEvent.cs @@ -21,6 +21,7 @@ namespace QSB.Events { return; } + _eventHandler = new MessageHandler(Type); _eventHandler.OnClientReceiveMessage += message => OnReceive(false, message); _eventHandler.OnServerReceiveMessage += message => OnReceive(true, message); diff --git a/QSB/Events/QSBEventManager.cs b/QSB/Events/QSBEventManager.cs index c72e887e..d552f2d7 100644 --- a/QSB/Events/QSBEventManager.cs +++ b/QSB/Events/QSBEventManager.cs @@ -109,6 +109,7 @@ namespace QSB.Events { return; } + GlobalMessenger.FireEvent(eventName); } @@ -119,6 +120,7 @@ namespace QSB.Events DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); return; } + GlobalMessenger.FireEvent(eventName, arg); } @@ -129,6 +131,7 @@ namespace QSB.Events DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); return; } + GlobalMessenger.FireEvent(eventName, arg1, arg2); } @@ -139,6 +142,7 @@ namespace QSB.Events DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); return; } + GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3); } @@ -149,6 +153,7 @@ namespace QSB.Events DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); return; } + GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3, arg4); } @@ -159,6 +164,7 @@ namespace QSB.Events DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); return; } + GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3, arg4, arg5); } @@ -169,6 +175,7 @@ namespace QSB.Events DebugLog.ToConsole($"Warning - Tried to send event {eventName} while not connected to/hosting server.", MessageType.Warning); return; } + GlobalMessenger.FireEvent(eventName, arg1, arg2, arg3, arg4, arg5, arg6); } } diff --git a/QSB/GeyserSync/Events/GeyserEvent.cs b/QSB/GeyserSync/Events/GeyserEvent.cs index 94e5bd87..330e6d8d 100644 --- a/QSB/GeyserSync/Events/GeyserEvent.cs +++ b/QSB/GeyserSync/Events/GeyserEvent.cs @@ -27,6 +27,7 @@ namespace QSB.GeyserSync.Events { return; } + var geyser = QSBWorldSync.GetWorldFromId(message.ObjectId); geyser?.SetState(message.State); } diff --git a/QSB/GeyserSync/WorldObjects/QSBGeyser.cs b/QSB/GeyserSync/WorldObjects/QSBGeyser.cs index b4044768..0cac3e86 100644 --- a/QSB/GeyserSync/WorldObjects/QSBGeyser.cs +++ b/QSB/GeyserSync/WorldObjects/QSBGeyser.cs @@ -29,6 +29,7 @@ namespace QSB.GeyserSync.WorldObjects AttachedObject?.ActivateGeyser(); return; } + AttachedObject?.DeactivateGeyser(); } } diff --git a/QSB/Instruments/InstrumentsManager.cs b/QSB/Instruments/InstrumentsManager.cs index 3ec2d0c1..9a2c67f7 100644 --- a/QSB/Instruments/InstrumentsManager.cs +++ b/QSB/Instruments/InstrumentsManager.cs @@ -78,6 +78,7 @@ namespace QSB.Instruments // TODO : fix for instrument release mr.sharedMaterial = null; } + drum.transform.parent = _rootObj; drum.transform.rotation = _rootObj.rotation; drum.transform.localPosition = Vector3.zero; @@ -94,10 +95,12 @@ namespace QSB.Instruments DebugLog.ToConsole("Error - Tried to start instrument on non-local player!", MessageType.Error); return; } + if (Player.PlayingInstrument || !Locator.GetPlayerController().IsGrounded()) { return; } + _savedType = Player.AnimationSync.CurrentType; CameraManager.Instance.SwitchTo3rdPerson(); SwitchToType(type); @@ -109,6 +112,7 @@ namespace QSB.Instruments { return; } + CameraManager.Instance.SwitchTo1stPerson(); SwitchToType(_savedType); } diff --git a/QSB/Instruments/QSBCamera/CameraController.cs b/QSB/Instruments/QSBCamera/CameraController.cs index 6f3eec89..24394c80 100644 --- a/QSB/Instruments/QSBCamera/CameraController.cs +++ b/QSB/Instruments/QSBCamera/CameraController.cs @@ -23,6 +23,7 @@ namespace QSB.Instruments.QSBCamera { return; } + UpdatePosition(); UpdateInput(); UpdateRotation(); @@ -43,6 +44,7 @@ namespace QSB.Instruments.QSBCamera // Raycast didn't hit collider, get target from camera direction localTargetPoint = RayLength * PercentToMove * localDirection; } + var targetDistance = Vector3.Distance(origin, transform.TransformPoint(localTargetPoint)); var currentDistance = Vector3.Distance(origin, CameraObject.transform.position); var movement = targetDistance < currentDistance diff --git a/QSB/Instruments/QSBCamera/CameraManager.cs b/QSB/Instruments/QSBCamera/CameraManager.cs index adecb00b..d45df327 100644 --- a/QSB/Instruments/QSBCamera/CameraManager.cs +++ b/QSB/Instruments/QSBCamera/CameraManager.cs @@ -10,7 +10,6 @@ namespace QSB.Instruments.QSBCamera { public static CameraManager Instance; - public bool IsSetUp { get; private set; } public CameraMode Mode { get; private set; } @@ -71,16 +70,19 @@ namespace QSB.Instruments.QSBCamera Mode = CameraMode.ThirdPerson; return; } + if (Mode == CameraMode.ThirdPerson) { DebugLog.ToConsole("Warning - Already in 3rd person!", MessageType.Warning); return; } + if (OWInput.GetInputMode() != InputMode.Character) { DebugLog.ToConsole("Warning - Cannot change to 3rd person while not in Character inputmode!", MessageType.Warning); return; } + OWInput.ChangeInputMode(InputMode.None); QSBEventManager.FireEvent("SwitchActiveCamera", _owCamera); Locator.GetPlayerCamera().mainCamera.enabled = false; @@ -89,6 +91,7 @@ namespace QSB.Instruments.QSBCamera var postProcessing = _cameraObj.AddComponent(); postProcessing.profile = Locator.GetPlayerCamera().gameObject.GetComponent().profile; } + _camera.enabled = true; Mode = CameraMode.ThirdPerson; } @@ -102,11 +105,13 @@ namespace QSB.Instruments.QSBCamera Mode = CameraMode.FirstPerson; return; } + if (Mode == CameraMode.FirstPerson) { DebugLog.ToConsole("Warning - Already in 1st person!", MessageType.Warning); return; } + OWInput.ChangeInputMode(InputMode.Character); QSBEventManager.FireEvent("SwitchActiveCamera", Locator.GetPlayerCamera()); Locator.GetActiveCamera().mainCamera.enabled = true; diff --git a/QSB/ItemSync/Events/MoveToCarryEvent.cs b/QSB/ItemSync/Events/MoveToCarryEvent.cs index 7f94a2d6..450db0ca 100644 --- a/QSB/ItemSync/Events/MoveToCarryEvent.cs +++ b/QSB/ItemSync/Events/MoveToCarryEvent.cs @@ -50,6 +50,7 @@ namespace QSB.ItemSync.Events break; } + itemObject.PickUpItem(itemSocket, message.AboutId); } } diff --git a/QSB/ItemSync/Events/SocketItemEvent.cs b/QSB/ItemSync/Events/SocketItemEvent.cs index c6ef1cc4..2e66f015 100644 --- a/QSB/ItemSync/Events/SocketItemEvent.cs +++ b/QSB/ItemSync/Events/SocketItemEvent.cs @@ -42,6 +42,7 @@ namespace QSB.ItemSync.Events DebugLog.ToConsole($"Warning - Trying to start unsocket on socket that is unoccupied! Socket:{(socketWorldObject as IWorldObject).Name}"); return; } + socketWorldObject.RemoveFromSocket(); return; case SocketEventType.CompleteUnsocket: diff --git a/QSB/ItemSync/ItemManager.cs b/QSB/ItemSync/ItemManager.cs index 26d5005d..bb7c3c5b 100644 --- a/QSB/ItemSync/ItemManager.cs +++ b/QSB/ItemSync/ItemManager.cs @@ -27,6 +27,7 @@ namespace QSB.ItemSync DebugLog.ToConsole($"Error - Trying to run GetObject (Item) with null unity object!", MessageType.Error); return default; } + IQSBOWItem worldObj = null; if (unityObject.GetType() == typeof(ScrollItem)) { @@ -48,6 +49,7 @@ namespace QSB.ItemSync { DebugLog.ToConsole($"Warning - couldn't work out type of OWItem {unityObject.name}.", MessageType.Warning); } + return worldObj; } @@ -58,6 +60,7 @@ namespace QSB.ItemSync DebugLog.ToConsole($"Error - Trying to run GetObject (Socket) with null unity object!", MessageType.Error); return default; } + IQSBOWItemSocket worldObj = null; if (unityObject.GetType() == typeof(ScrollSocket)) { @@ -79,6 +82,7 @@ namespace QSB.ItemSync { DebugLog.ToConsole($"Warning - couldn't work out type of OWItemSocket {unityObject.name}.", MessageType.Warning); } + return worldObj; } } diff --git a/QSB/ItemSync/Patches/ItemPatches.cs b/QSB/ItemSync/Patches/ItemPatches.cs index fece3228..314cbca3 100644 --- a/QSB/ItemSync/Patches/ItemPatches.cs +++ b/QSB/ItemSync/Patches/ItemPatches.cs @@ -61,10 +61,12 @@ namespace QSB.ItemSync.Patches gameObject2 = gameObject2.transform.parent.gameObject; sectorGroup = gameObject2.GetComponent(); } + if (sectorGroup != null) { sector = sectorGroup.GetSector(); } + var parent = (detachableFragment != null) ? detachableFragment.transform : targetRigidbody.transform; @@ -79,6 +81,7 @@ namespace QSB.ItemSync.Patches QSBEventManager.FireEvent(EventNames.QSBDropItem, objectId, localPos, hit.normal, parentSector); return false; } + DebugLog.ToConsole($"Error - No sector found for rigidbody {targetRigidbody.name}!.", MessageType.Error); return false; } diff --git a/QSB/ItemSync/WorldObjects/QSBOWItem.cs b/QSB/ItemSync/WorldObjects/QSBOWItem.cs index be971eb6..acca3daa 100644 --- a/QSB/ItemSync/WorldObjects/QSBOWItem.cs +++ b/QSB/ItemSync/WorldObjects/QSBOWItem.cs @@ -27,6 +27,7 @@ namespace QSB.ItemSync.WorldObjects var qsbObj = ItemManager.GetObject(InitialParent.GetComponent()); InitialSocket = qsbObj; } + QSBPlayerManager.OnRemovePlayer += OnPlayerLeave; } @@ -38,11 +39,13 @@ namespace QSB.ItemSync.WorldObjects { return; } + if (InitialSocket != null) { InitialSocket.PlaceIntoSocket(this); return; } + AttachedObject.transform.parent = InitialParent; AttachedObject.transform.localPosition = InitialPosition; AttachedObject.transform.localRotation = InitialRotation; @@ -63,7 +66,6 @@ namespace QSB.ItemSync.WorldObjects HoldingPlayer = 0; } - public virtual void PickUpItem(Transform holdTransform, uint playerId) { AttachedObject.PickUpItem(holdTransform); diff --git a/QSB/LogSync/Events/RevealFactEvent.cs b/QSB/LogSync/Events/RevealFactEvent.cs index 008452cb..3c93efb2 100644 --- a/QSB/LogSync/Events/RevealFactEvent.cs +++ b/QSB/LogSync/Events/RevealFactEvent.cs @@ -34,10 +34,12 @@ namespace QSB.LogSync.Events { QSBWorldSync.AddFactReveal(message.FactId, message.SaveGame, message.ShowNotification); } + if (!QSBCore.WorldObjectsReady) { return; } + Locator.GetShipLogManager().RevealFact(message.FactId, message.SaveGame, message.ShowNotification); } } diff --git a/QSB/LogSync/Patches/LogPatches.cs b/QSB/LogSync/Patches/LogPatches.cs index 5661af83..361b82b0 100644 --- a/QSB/LogSync/Patches/LogPatches.cs +++ b/QSB/LogSync/Patches/LogPatches.cs @@ -13,6 +13,7 @@ namespace QSB.LogSync.Patches { return; } + QSBEventManager.FireEvent(EventNames.QSBRevealFact, id, saveGame, showNotification); } diff --git a/QSB/Messaging/MessageHandler.cs b/QSB/Messaging/MessageHandler.cs index 33f8698a..90b604e0 100644 --- a/QSB/Messaging/MessageHandler.cs +++ b/QSB/Messaging/MessageHandler.cs @@ -35,6 +35,7 @@ namespace QSB.Messaging QNetworkServer.handlers.Remove(_eventType); QNetworkManager.singleton.client.handlers.Remove(_eventType); } + QNetworkServer.RegisterHandler(_eventType, OnServerReceiveMessageHandler); QNetworkManager.singleton.client.RegisterHandler(_eventType, OnClientReceiveMessageHandler); } @@ -45,6 +46,7 @@ namespace QSB.Messaging { return; } + QNetworkServer.SendToAll(_eventType, message); } @@ -54,6 +56,7 @@ namespace QSB.Messaging { return; } + QNetworkManager.singleton.client.Send(_eventType, message); } diff --git a/QSB/OrbSync/Events/OrbUserEvent.cs b/QSB/OrbSync/Events/OrbUserEvent.cs index 9e3535f2..9181b8da 100644 --- a/QSB/OrbSync/Events/OrbUserEvent.cs +++ b/QSB/OrbSync/Events/OrbUserEvent.cs @@ -57,15 +57,18 @@ namespace QSB.OrbSync.Events DebugLog.ToConsole($"Error - OrbTransformSyncs is empty or null. (ID {message.ObjectId})", MessageType.Error); return; } + if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count == 0) { DebugLog.ToConsole($"Error - OldOrbList is empty or null. (ID {message.ObjectId})", MessageType.Error); return; } + if (fromPlayer == null) { DebugLog.ToConsole("Error - FromPlayer is null!", MessageType.Error); } + var orbSync = NomaiOrbTransformSync.OrbTransformSyncs .FirstOrDefault(x => x.AttachedObject == QSBWorldSync.OldOrbList[message.ObjectId].gameObject); if (orbSync == null) @@ -73,16 +76,19 @@ namespace QSB.OrbSync.Events DebugLog.ToConsole($"Error - No orb found for user event. (ID {message.ObjectId})", MessageType.Error); return; } + var orbIdentity = orbSync.GetComponent(); if (orbIdentity == null) { DebugLog.ToConsole($"Error - Orb identity is null. (ID {message.ObjectId})", MessageType.Error); return; } + if (orbIdentity.ClientAuthorityOwner != null && orbIdentity.ClientAuthorityOwner != fromPlayer) { orbIdentity.RemoveClientAuthority(orbIdentity.ClientAuthorityOwner); } + orbIdentity.AssignClientAuthority(fromPlayer); orbSync.enabled = true; } @@ -94,16 +100,19 @@ namespace QSB.OrbSync.Events DebugLog.ToConsole($"Error - OrbTransformSyncs is empty or null. (ID {message.ObjectId})", MessageType.Error); return; } + if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count == 0) { DebugLog.ToConsole($"Error - OldOrbList is empty or null. (ID {message.ObjectId})", MessageType.Error); return; } + if (!NomaiOrbTransformSync.OrbTransformSyncs.Any(x => x.AttachedObject == QSBWorldSync.OldOrbList[message.ObjectId].gameObject)) { DebugLog.ToConsole($"Error - No NomaiOrbTransformSync has AttachedOrb with objectId {message.ObjectId}!"); return; } + var orb = NomaiOrbTransformSync.OrbTransformSyncs .First(x => x.AttachedObject == QSBWorldSync.OldOrbList[message.ObjectId].gameObject); orb.enabled = true; diff --git a/QSB/OrbSync/OrbManager.cs b/QSB/OrbSync/OrbManager.cs index 5dcd9031..61aef15f 100644 --- a/QSB/OrbSync/OrbManager.cs +++ b/QSB/OrbSync/OrbManager.cs @@ -28,6 +28,7 @@ namespace QSB.OrbSync NomaiOrbTransformSync.OrbTransformSyncs.Clear(); QSBWorldSync.OldOrbList.ForEach(x => QNetworkServer.Spawn(Instantiate(QSBNetworkManager.Instance.OrbPrefab))); } + DebugLog.DebugWrite($"Finished orb build with {QSBWorldSync.OldOrbList.Count} orbs.", MessageType.Success); } } diff --git a/QSB/OrbSync/Patches/OrbPatches.cs b/QSB/OrbSync/Patches/OrbPatches.cs index 04765147..3c407dea 100644 --- a/QSB/OrbSync/Patches/OrbPatches.cs +++ b/QSB/OrbSync/Patches/OrbPatches.cs @@ -25,6 +25,7 @@ namespace QSB.OrbSync.Patches __result = false; return false; } + var orbDistance = Vector3.Distance(orb.transform.position, __instance.transform.position); var triggerRadius = orb.IsBeingDragged() ? ____exitRadius : ____radius; if (____occupyingOrb == null && orbDistance < ____radius) @@ -35,14 +36,17 @@ namespace QSB.OrbSync.Patches QSBWorldSync.HandleSlotStateChange(__instance, orb, true); QSBWorldSync.RaiseEvent(__instance, "OnSlotActivated", __instance); } + __result = true; return false; } + if (____occupyingOrb == null || ____occupyingOrb != orb) { __result = false; return false; } + if (orbDistance > triggerRadius) { QSBWorldSync.HandleSlotStateChange(__instance, orb, false); @@ -51,6 +55,7 @@ namespace QSB.OrbSync.Patches __result = false; return false; } + __result = true; return false; } diff --git a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs index 6edf9820..b3b4b515 100644 --- a/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs +++ b/QSB/OrbSync/TransformSync/NomaiOrbTransformSync.cs @@ -33,16 +33,19 @@ namespace QSB.OrbSync.TransformSync DebugLog.ToConsole($"Error - Index cannot be found.", OWML.Common.MessageType.Error); return null; } + if (QSBWorldSync.OldOrbList == null || QSBWorldSync.OldOrbList.Count <= _index) { DebugLog.ToConsole($"Error - OldOrbList is null or does not contain index {_index}.", OWML.Common.MessageType.Error); return null; } + if (QSBWorldSync.OldOrbList[_index] == null) { DebugLog.ToConsole($"Error - OldOrbList index {_index} is null.", OWML.Common.MessageType.Error); return null; } + return QSBWorldSync.OldOrbList[_index].gameObject; } diff --git a/QSB/OrbSync/WorldObjects/QSBOrbSlot.cs b/QSB/OrbSync/WorldObjects/QSBOrbSlot.cs index 153a0b95..3c18fe41 100644 --- a/QSB/OrbSync/WorldObjects/QSBOrbSlot.cs +++ b/QSB/OrbSync/WorldObjects/QSBOrbSlot.cs @@ -23,6 +23,7 @@ namespace QSB.OrbSync.WorldObjects { return; } + QSBEventManager.FireEvent(EventNames.QSBOrbSlot, ObjectId, orbId, state); } @@ -32,6 +33,7 @@ namespace QSB.OrbSync.WorldObjects { return; } + var occOrb = state ? QSBWorldSync.OldOrbList[orbId] : null; AttachedObject.SetValue("_occupyingOrb", occOrb); var ev = state ? "OnSlotActivated" : "OnSlotDeactivated"; diff --git a/QSB/Patches/QSBPatch.cs b/QSB/Patches/QSBPatch.cs index 4f0108dc..7c5fd46a 100644 --- a/QSB/Patches/QSBPatch.cs +++ b/QSB/Patches/QSBPatch.cs @@ -22,6 +22,7 @@ namespace QSB.Patches DebugLog.DebugWrite($"[Unpatch] {item.DeclaringType}.{item.Name}", MessageType.Info); instance.Unpatch(item, HarmonyPatchType.All); } + _patchedMethods.Clear(); } @@ -54,6 +55,7 @@ namespace QSB.Patches { QSBCore.Helper.HarmonyHelper.AddPostfix(method, GetType(), patchName); } + _patchedMethods.Add(method); } @@ -94,6 +96,7 @@ namespace QSB.Patches return assemblyTypes[j]; } } + return null; } } diff --git a/QSB/Player/Events/PlayerEntangledEvent.cs b/QSB/Player/Events/PlayerEntangledEvent.cs index ea6207ff..047f6d9e 100644 --- a/QSB/Player/Events/PlayerEntangledEvent.cs +++ b/QSB/Player/Events/PlayerEntangledEvent.cs @@ -28,6 +28,7 @@ namespace QSB.Player.Events player.EntangledObject = null; return; } + var quantumObject = QSBWorldSync.GetWorldFromId(message.ObjectId); player.EntangledObject = quantumObject; } @@ -40,6 +41,7 @@ namespace QSB.Player.Events player.EntangledObject = null; return; } + var quantumObject = QSBWorldSync.GetWorldFromId(message.ObjectId); player.EntangledObject = quantumObject; } diff --git a/QSB/Player/Events/PlayerJoinEvent.cs b/QSB/Player/Events/PlayerJoinEvent.cs index de099f0b..a5ebc03d 100644 --- a/QSB/Player/Events/PlayerJoinEvent.cs +++ b/QSB/Player/Events/PlayerJoinEvent.cs @@ -28,6 +28,7 @@ namespace QSB.Player.Events QSBEventManager.FireEvent(EventNames.QSBPlayerKick, message.AboutId, KickReason.VersionNotMatching); return; } + var player = QSBPlayerManager.GetPlayer(message.AboutId); player.Name = message.PlayerName; DebugLog.ToAll($"{player.Name} joined!", MessageType.Info); diff --git a/QSB/Player/Events/PlayerKickEvent.cs b/QSB/Player/Events/PlayerKickEvent.cs index 86a5108a..258eeb03 100644 --- a/QSB/Player/Events/PlayerKickEvent.cs +++ b/QSB/Player/Events/PlayerKickEvent.cs @@ -27,6 +27,7 @@ namespace QSB.Player.Events { return; } + QSBCore.UnityEvents.FireInNUpdates(() => KickPlayer(message.AboutId), 10); } @@ -42,9 +43,11 @@ namespace QSB.Player.Events DebugLog.ToAll($"{QSBPlayerManager.GetPlayer(message.AboutId).Name} was kicked."); return; } + DebugLog.ToAll($"Player id:{message.AboutId} was kicked."); return; } + DebugLog.ToAll($"Kicked from server. Reason : {message.EnumValue}"); } } diff --git a/QSB/Player/PlayerEntanglementWatcher.cs b/QSB/Player/PlayerEntanglementWatcher.cs index e95b1248..77479a1a 100644 --- a/QSB/Player/PlayerEntanglementWatcher.cs +++ b/QSB/Player/PlayerEntanglementWatcher.cs @@ -16,11 +16,13 @@ namespace QSB.Player { return; } + var controller = Locator.GetPlayerController(); if (controller == null) { return; } + var collidingQuantumObject = controller.GetValue("_collidingQuantumObject"); if (_previousCollidingQuantumObject != collidingQuantumObject) { diff --git a/QSB/Player/PlayerHUDMarker.cs b/QSB/Player/PlayerHUDMarker.cs index d1e978cf..222a27ac 100644 --- a/QSB/Player/PlayerHUDMarker.cs +++ b/QSB/Player/PlayerHUDMarker.cs @@ -38,6 +38,7 @@ namespace QSB.Player { return; } + _markerLabel = _player.Name.ToUpper(); _isReady = false; @@ -51,10 +52,12 @@ namespace QSB.Player { _canvasMarker.DestroyMarker(); } + if (_markerTarget != null) { Destroy(_markerTarget.gameObject); } + Destroy(this); } } diff --git a/QSB/Player/PlayerInfo.cs b/QSB/Player/PlayerInfo.cs index b973b8d3..773b0ea8 100644 --- a/QSB/Player/PlayerInfo.cs +++ b/QSB/Player/PlayerInfo.cs @@ -67,6 +67,7 @@ namespace QSB.Player { return; } + FlashLight?.UpdateState(PlayerStates.FlashlightActive); Translator?.ChangeEquipState(PlayerStates.TranslatorEquipped); ProbeLauncher?.ChangeEquipState(PlayerStates.ProbeLauncherEquipped); diff --git a/QSB/Player/PlayerMapMarker.cs b/QSB/Player/PlayerMapMarker.cs index 55080ab2..efb76f34 100644 --- a/QSB/Player/PlayerMapMarker.cs +++ b/QSB/Player/PlayerMapMarker.cs @@ -41,6 +41,7 @@ namespace QSB.Player { markerManager.RegisterMarker(_canvasMarker, transform); } + _canvasMarker.SetLabel(PlayerName.ToUpper()); _canvasMarker.SetColor(Color.white); _canvasMarker.SetVisibility(false); @@ -56,6 +57,7 @@ namespace QSB.Player { InitMarker(); } + var a = Locator.GetActiveCamera().WorldToScreenPoint(transform.position); var b = Locator.GetActiveCamera().WorldToScreenPoint(_playerTransform.position); var vector = a - b; diff --git a/QSB/Player/QSBPlayerManager.cs b/QSB/Player/QSBPlayerManager.cs index 8a6564e1..396702a8 100644 --- a/QSB/Player/QSBPlayerManager.cs +++ b/QSB/Player/QSBPlayerManager.cs @@ -25,11 +25,13 @@ namespace QSB.Player $"{Environment.NewLine} Called from {method.DeclaringType.Name}.{method.Name} ", MessageType.Error); return uint.MaxValue; } + if (localInstance.NetIdentity == null) { DebugLog.ToConsole($"Error - Trying to get LocalPlayerId when the local PlayerTransformSync instance's QNetworkIdentity is null.", MessageType.Error); return uint.MaxValue; } + return localInstance.NetIdentity.NetId.Value; } } @@ -54,11 +56,13 @@ namespace QSB.Player { return default; } + var player = PlayerList.FirstOrDefault(x => x.PlayerId == id); if (player != null) { return player; } + var trace = new StackTrace().GetFrame(1).GetMethod(); DebugLog.DebugWrite($"Create Player : id<{id}> (Called from {trace.DeclaringType.Name}.{trace.Name})", MessageType.Info); player = new PlayerInfo(id); @@ -112,6 +116,7 @@ namespace QSB.Player { cameraList.Add(LocalPlayer); } + return cameraList; } @@ -132,6 +137,7 @@ namespace QSB.Player DebugLog.ToConsole($"Warning - Player {playerId} has a null player model!", MessageType.Warning); return; } + foreach (var renderer in player.Body.GetComponentsInChildren()) { renderer.enabled = visible; @@ -152,6 +158,7 @@ namespace QSB.Player DebugLog.DebugWrite($"Error - Cannot get closest player from empty player list.", MessageType.Error); return null; } + return playerList.Where(x => x.PlayerStates.IsReady).OrderBy(x => Vector3.Distance(x.Body.transform.position, worldPoint)).FirstOrDefault(); } } diff --git a/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs b/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs index 2779a73b..5fdab7a6 100644 --- a/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs +++ b/QSB/PoolSync/CustomNomaiRemoteCameraPlatform.cs @@ -79,6 +79,7 @@ namespace QSB.PoolSync s_propID_Ripple2Position = Shader.PropertyToID("_Ripple2Position"); s_propID_Ripple2Params = Shader.PropertyToID("_Ripple2Params"); } + _socket = GetComponentInChildren(); if (_socket != null) { @@ -88,6 +89,7 @@ namespace QSB.PoolSync { Debug.LogWarning("SharedStoneSocket not found!", this); } + UpdatePoolRenderer(); _hologramGroup.SetActive(false); UpdateRendererFade(); @@ -101,6 +103,7 @@ namespace QSB.PoolSync { CustomPlatformList = new List(32); } + CustomPlatformList.Add(this); _playerCamera = Locator.GetPlayerCamera(); if (_socket != null) @@ -108,6 +111,7 @@ namespace QSB.PoolSync _socket.OnSocketableRemoved += OnSocketableRemoved; _socket.OnSocketableDonePlacing += OnSocketableDonePlacing; } + enabled = false; QSBPlayerManager.OnRemovePlayer += OnRemovePlayer; } @@ -119,15 +123,18 @@ namespace QSB.PoolSync _socket.OnSocketableRemoved -= OnSocketableRemoved; _socket.OnSocketableDonePlacing -= OnSocketableDonePlacing; } + if (CustomPlatformList != null) { CustomPlatformList.Remove(this); } + if (_cameraState == CameraState.Connected || _cameraState == CameraState.Connecting_FadeIn || _cameraState == CameraState.Connecting_FadeOut) { DisconnectCamera(); SwitchToPlayerCamera(); } + QSBPlayerManager.OnRemovePlayer -= OnRemovePlayer; } @@ -159,6 +166,7 @@ namespace QSB.PoolSync UpdateHologramTransforms(); } } + if (_platformActive) { UpdatePools(1f, _poolFillLength); @@ -167,6 +175,7 @@ namespace QSB.PoolSync { UpdatePools(0f, _poolEmptyLength); } + switch (_cameraState) { case CameraState.WaitingForPedestalContact: @@ -175,6 +184,7 @@ namespace QSB.PoolSync _cameraState = CameraState.Disconnected; ConnectCamera(); } + break; case CameraState.Connecting_FadeIn: _transitionFade = Mathf.MoveTowards(_transitionFade, 1f, Time.deltaTime / _fadeInLength); @@ -195,6 +205,7 @@ namespace QSB.PoolSync Locator.GetAudioMixer().MixRemoteCameraPlatform(_fadeInLength); _cameraState = CameraState.Connecting_FadeOut; } + break; case CameraState.Connecting_FadeOut: _slavePlatform._transitionFade = Mathf.MoveTowards(_slavePlatform._transitionFade, 0f, Time.deltaTime / _fadeInLength); @@ -205,6 +216,7 @@ namespace QSB.PoolSync { _cameraState = CameraState.Connected; } + break; case CameraState.Connected: VerifySectorOccupancy(); @@ -231,6 +243,7 @@ namespace QSB.PoolSync _hologramGroup.SetActive(false); _cameraState = CameraState.Disconnecting_FadeOut; } + break; case CameraState.Disconnecting_FadeOut: _transitionFade = Mathf.MoveTowards(_transitionFade, 0f, Time.deltaTime / _fadeOutLength); @@ -239,8 +252,10 @@ namespace QSB.PoolSync { _cameraState = CameraState.Disconnected; } + break; } + if (_cameraState == CameraState.Disconnected && !_platformActive && _poolT == 0f) { enabled = false; @@ -256,8 +271,10 @@ namespace QSB.PoolSync { _slavePlatform = null; } + return; } + UpdatePoolRenderer(); _slavePlatform._poolT = _poolT; _slavePlatform.UpdatePoolRenderer(); @@ -276,16 +293,17 @@ namespace QSB.PoolSync { parentSector.AddOccupant(Locator.GetPlayerSectorDetector()); } + parentSector = parentSector.GetParentSector(); } } + if (_slavePlatform._visualSector2 != null && !_slavePlatform._visualSector2.ContainsOccupant(DynamicOccupant.Player)) { _slavePlatform._visualSector2.AddOccupant(Locator.GetPlayerSectorDetector()); } } - private void UpdatePoolRenderer() { _poolRenderer.transform.localPosition = new Vector3(0f, _poolHeightCurve.Evaluate(_poolT), 0f); @@ -302,6 +320,7 @@ namespace QSB.PoolSync ripplePosition.y = playerPosition.z; rippleParams.x = 0.5f; } + _poolRenderer.material.SetVector(s_propID_Ripple2Position, ripplePosition); _poolRenderer.material.SetVector(s_propID_Ripple2Params, rippleParams); } @@ -321,6 +340,7 @@ namespace QSB.PoolSync _transitionRenderers[i].enabled = true; } } + _ownedCamera.SetImageEffectFade(1f - _transitionFade); } @@ -339,6 +359,7 @@ namespace QSB.PoolSync DebugLog.ToConsole($"Error - Gameobject for {item.Key.PlayerId} in _playerToHologram is null!", MessageType.Error); continue; } + var hologram = item.Value.transform.GetChild(0); hologram.position = TransformPoint(item.Key.Body.transform.position, this, _slavePlatform); hologram.rotation = TransformRotation(item.Key.Body.transform.rotation, this, _slavePlatform); @@ -362,10 +383,12 @@ namespace QSB.PoolSync { QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this)); } + if (_slavePlatform == null) { return; } + DisconnectCamera(); _transitionStone.SetActive(false); _slavePlatform._transitionStone.SetActive(false); @@ -374,14 +397,17 @@ namespace QSB.PoolSync { _transitionPedestalAnimator.PlayOpen(); } + if (_slavePlatform._pedestalAnimator != null) { _slavePlatform._pedestalAnimator.PlayOpen(); } + if (_slavePlatform._transitionPedestalAnimator != null) { _slavePlatform._transitionPedestalAnimator.PlayOpen(); } + _sharedStone = null; _platformActive = false; _wasLocalInBounds = false; @@ -395,17 +421,20 @@ namespace QSB.PoolSync { Debug.LogError("Placed an empty item or a non SharedStone in a NomaiRemoteCameraPlatform"); } + _slavePlatform = GetPlatform(_sharedStone.GetRemoteCameraID()); if (_slavePlatform == null) { Debug.LogError("Shared stone with Remote Camera ID: " + _sharedStone.GetRemoteCameraID() + " has no registered camera platform!"); } + if (_slavePlatform == this || !_slavePlatform.gameObject.activeSelf) { _sharedStone = null; _slavePlatform = null; return; } + _transitionStone.SetActive(true); _slavePlatform._transitionStone.SetActive(true); _socket.GetPedestalAnimator().PlayClose(); @@ -413,14 +442,17 @@ namespace QSB.PoolSync { _transitionPedestalAnimator.PlayClose(); } + if (_slavePlatform._pedestalAnimator != null) { _slavePlatform._pedestalAnimator.PlayClose(); } + if (_slavePlatform._transitionPedestalAnimator != null) { _slavePlatform._transitionPedestalAnimator.PlayClose(); } + enabled = true; } @@ -438,6 +470,7 @@ namespace QSB.PoolSync { _alreadyOccupiedSectors.Add(_visualSector); } + _slavePlatform._visualSector.AddOccupant(Locator.GetPlayerSectorDetector()); var parentSector = _slavePlatform._visualSector.GetParentSector(); while (parentSector != null) @@ -446,14 +479,17 @@ namespace QSB.PoolSync { _alreadyOccupiedSectors.Add(parentSector); } + parentSector.AddOccupant(Locator.GetPlayerSectorDetector()); parentSector = parentSector.GetParentSector(); } } + if (_slavePlatform._visualSector2 != null) { _slavePlatform._visualSector2.AddOccupant(Locator.GetPlayerSectorDetector()); } + if (_slavePlatform._darkZone != null) { _slavePlatform._darkZone.AddPlayerToZone(true); @@ -468,6 +504,7 @@ namespace QSB.PoolSync { _slavePlatform._visualSector.RemoveOccupant(Locator.GetPlayerSectorDetector()); } + var parentSector = _slavePlatform._visualSector.GetParentSector(); while (parentSector != null) { @@ -475,17 +512,21 @@ namespace QSB.PoolSync { parentSector.RemoveOccupant(Locator.GetPlayerSectorDetector()); } + parentSector = parentSector.GetParentSector(); } } + if (_slavePlatform._visualSector2 != null) { _slavePlatform._visualSector2.RemoveOccupant(Locator.GetPlayerSectorDetector()); } + if (_slavePlatform._darkZone != null) { _slavePlatform._darkZone.RemovePlayerFromZone(true); } + QSBEventManager.FireEvent(EventNames.QSBExitPlatform, CustomPlatformList.IndexOf(this)); GlobalMessenger.FireEvent("ExitNomaiRemoteCamera"); _slavePlatform._ownedCamera.Deactivate(); @@ -506,6 +547,7 @@ namespace QSB.PoolSync { return; } + var cameraState = _cameraState; if (cameraState != CameraState.Disconnected && cameraState != CameraState.Disconnecting_FadeOut) { @@ -518,6 +560,7 @@ namespace QSB.PoolSync { _cameraState = CameraState.Connecting_FadeIn; } + _oneShotAudioSource.PlayOneShot(AudioType.NomaiRemoteCameraEntry, 1f); enabled = true; } @@ -528,6 +571,7 @@ namespace QSB.PoolSync { return; } + var cameraState = _cameraState; if (cameraState != CameraState.Connected && cameraState != CameraState.Connecting_FadeOut) { @@ -551,6 +595,7 @@ namespace QSB.PoolSync { return; } + if (_pedestalAnimator.HasMadeContact()) { ConnectCamera(); @@ -569,21 +614,25 @@ namespace QSB.PoolSync { return; } + _platformActive = false; if (_pedestalAnimator != null) { _pedestalAnimator.PlayOpen(); } + if (_transitionPedestalAnimator != null) { _transitionPedestalAnimator.PlayOpen(); } + if (_slavePlatform != null) { if (_slavePlatform._pedestalAnimator != null) { _slavePlatform._pedestalAnimator.PlayOpen(); } + if (_slavePlatform._transitionPedestalAnimator != null) { _slavePlatform._transitionPedestalAnimator.PlayOpen(); @@ -615,6 +664,7 @@ namespace QSB.PoolSync } } } + return null; } @@ -628,16 +678,19 @@ namespace QSB.PoolSync { return; } + var player = QSBPlayerManager.GetPlayer(id); if (!_playerToHologram.Any(x => x.Key == player)) { return; } + var hologram = _playerToHologram.First(x => x.Key == player).Value; if (hologram.activeSelf) { OnRemotePlayerExit(id); } + _playerToHologram.Remove(player); } @@ -656,6 +709,7 @@ namespace QSB.PoolSync _playerToHologram[player].SetActive(true); return; } + var hologramCopy = Instantiate(_playerHologram); hologramCopy.parent = _playerHologram.parent; Destroy(hologramCopy.GetChild(0).GetComponent()); @@ -673,6 +727,7 @@ namespace QSB.PoolSync { DebugLog.ToConsole($"Warning - {playerId}'s VisibleAnimator is null!", MessageType.Error); } + mirror.Init(player.AnimationSync.VisibleAnimator, hologramCopy.GetChild(0).gameObject.GetComponent()); _playerToHologram.Add(player, hologramCopy.gameObject); @@ -686,11 +741,13 @@ namespace QSB.PoolSync { return; } + var player = QSBPlayerManager.GetPlayer(playerId); if (!_playerToHologram.ContainsKey(player)) { return; } + _playerToHologram[player].SetActive(false); if (!_platformActive) diff --git a/QSB/PoolSync/PoolManager.cs b/QSB/PoolSync/PoolManager.cs index e534b953..d5b93fe5 100644 --- a/QSB/PoolSync/PoolManager.cs +++ b/QSB/PoolSync/PoolManager.cs @@ -11,10 +11,12 @@ namespace QSB.PoolSync { streaming.gameObject.AddComponent(); } + foreach (var camera in Resources.FindObjectsOfTypeAll()) { camera.gameObject.AddComponent(); } + foreach (var platform in Resources.FindObjectsOfTypeAll()) { platform.gameObject.AddComponent(); diff --git a/QSB/ProbeSync/QSBProbe.cs b/QSB/ProbeSync/QSBProbe.cs index 212adc51..975b01aa 100644 --- a/QSB/ProbeSync/QSBProbe.cs +++ b/QSB/ProbeSync/QSBProbe.cs @@ -13,6 +13,7 @@ namespace QSB.ProbeSync gameObject.Show(); return; } + gameObject.Hide(); } } diff --git a/QSB/QSBCore.cs b/QSB/QSBCore.cs index abcd24df..43bb288e 100644 --- a/QSB/QSBCore.cs +++ b/QSB/QSBCore.cs @@ -169,7 +169,6 @@ namespace QSB offset3 += _debugLineSpacing; } - GUI.Label(new Rect(420, offset3, 200f, 20f), $"Current Flyer : {ShipManager.Instance.CurrentFlyer}"); offset3 += _debugLineSpacing; var ship = ShipTransformSync.LocalInstance; @@ -197,6 +196,7 @@ namespace QSB GUI.Label(new Rect(420, offset3, 400f, 20f), $"Ship velocity mag. : {ship.GetVelocityChangeMagnitude()}"); offset3 += _debugLineSpacing; } + GUI.Label(new Rect(420, offset3, 200f, 20f), $"Ship sectors :"); offset3 += _debugLineSpacing; foreach (var sector in ship.SectorSync.SectorList) @@ -241,6 +241,7 @@ namespace QSB { QSBNetworkManager.Instance.networkPort = Port; } + DebugMode = config.GetSettingsValue("debugMode"); ShowLinesInDebug = config.GetSettingsValue("showLinesInDebug"); } diff --git a/QSB/QSBNetworkManager.cs b/QSB/QSBNetworkManager.cs index 37dd0713..e16e0945 100644 --- a/QSB/QSBNetworkManager.cs +++ b/QSB/QSBNetworkManager.cs @@ -112,6 +112,7 @@ namespace QSB child.Target = item.target; Destroy(item); } + Destroy(go.GetComponent()); Destroy(go.GetComponent()); } @@ -252,10 +253,12 @@ namespace QSB { Destroy(platform); } + foreach (var camera in Resources.FindObjectsOfTypeAll()) { Destroy(camera); } + foreach (var streaming in Resources.FindObjectsOfTypeAll()) { Destroy(streaming); diff --git a/QSB/QSBSceneManager.cs b/QSB/QSBSceneManager.cs index 34e55b81..b139eed6 100644 --- a/QSB/QSBSceneManager.cs +++ b/QSB/QSBSceneManager.cs @@ -29,6 +29,7 @@ namespace QSB // So objects have time to be deleted, made, whatever QSBCore.UnityEvents.FireOnNextUpdate(() => WorldObjectManager.Rebuild(newScene)); } + OnSceneLoaded?.SafeInvoke(newScene, universe); if (universe) { diff --git a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs index 81c814bd..8b6919b0 100644 --- a/QSB/QuantumSync/Events/MoonStateChangeEvent.cs +++ b/QSB/QuantumSync/Events/MoonStateChangeEvent.cs @@ -29,6 +29,7 @@ namespace QSB.QuantumSync.Events { return; } + var moon = Locator.GetQuantumMoon(); var wasPlayerEntangled = moon.IsPlayerEntangled(); var location = new RelativeLocationData(Locator.GetPlayerTransform().GetComponent(), moon.transform); @@ -44,6 +45,7 @@ namespace QSB.QuantumSync.Events { Physics.SyncTransforms(); } + constantFoceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true); moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, moonBody, message.OrbitAngle) + owRigidbody.GetVelocity()); moon.SetValue("_stateIndex", message.StateIndex); @@ -57,12 +59,14 @@ namespace QSB.QuantumSync.Events moon.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(moon, new object[] { -1 }); moon.GetValue("_quantumSignal").SetSignalActivation(message.StateIndex != 5, 2f); } + moon.GetValue("_referenceFrameVolume").gameObject.SetActive(message.StateIndex != 5); moonBody.SetIsTargetable(message.StateIndex != 5); foreach (var obj in moon.GetValue("_deactivateAtEye")) { obj.SetActive(message.StateIndex != 5); } + GlobalMessenger.FireEvent("QuantumMoonChangeState", moonBody); if (wasPlayerEntangled) diff --git a/QSB/QuantumSync/Events/MultiStateChangeEvent.cs b/QSB/QuantumSync/Events/MultiStateChangeEvent.cs index 1c28db80..cc5ae231 100644 --- a/QSB/QuantumSync/Events/MultiStateChangeEvent.cs +++ b/QSB/QuantumSync/Events/MultiStateChangeEvent.cs @@ -28,6 +28,7 @@ namespace QSB.QuantumSync.Events { return; } + var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); qsbObj.DebugBoxText.text = message.StateIndex.ToString(); } @@ -38,12 +39,14 @@ namespace QSB.QuantumSync.Events { return; } + var qsbObj = QSBWorldSync.GetWorldFromId(message.ObjectId); if (qsbObj.ControllingPlayer != message.FromId) { DebugLog.ToConsole($"Error - Got MultiStateChangeEvent for {qsbObj.Name} from {message.FromId}, but it's currently controlled by {qsbObj.ControllingPlayer}!", MessageType.Error); return; } + qsbObj.ChangeState(message.StateIndex); } } diff --git a/QSB/QuantumSync/Events/QuantumShuffleEvent.cs b/QSB/QuantumSync/Events/QuantumShuffleEvent.cs index ba05bf1a..ba7d0454 100644 --- a/QSB/QuantumSync/Events/QuantumShuffleEvent.cs +++ b/QSB/QuantumSync/Events/QuantumShuffleEvent.cs @@ -26,6 +26,7 @@ namespace QSB.QuantumSync.Events { return; } + var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); obj.ShuffleObjects(message.IndexArray); } diff --git a/QSB/QuantumSync/Events/SocketStateChangeEvent.cs b/QSB/QuantumSync/Events/SocketStateChangeEvent.cs index 8cb23c85..fae1d8a1 100644 --- a/QSB/QuantumSync/Events/SocketStateChangeEvent.cs +++ b/QSB/QuantumSync/Events/SocketStateChangeEvent.cs @@ -30,12 +30,14 @@ namespace QSB.QuantumSync.Events { return; } + var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); if (obj.ControllingPlayer != message.FromId) { DebugLog.ToConsole($"Error - Got SocketStateChangeEvent for {obj.Name} from {message.FromId}, but it's currently controlled by {obj.ControllingPlayer}!", MessageType.Error); return; } + obj.MoveToSocket(message); } } diff --git a/QSB/QuantumSync/Patches/QuantumPatches.cs b/QSB/QuantumSync/Patches/QuantumPatches.cs index 7e70cee3..2033c6e8 100644 --- a/QSB/QuantumSync/Patches/QuantumPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumPatches.cs @@ -106,6 +106,7 @@ namespace QSB.QuantumSync.Patches __result = true; return false; } + bool socketNotSuitable; var isSocketIlluminated = (bool)__instance.GetType().GetMethod("CheckIllumination", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null); @@ -135,12 +136,14 @@ namespace QSB.QuantumSync.Patches __result = true; return false; } + list.RemoveAt(index); if (list.Count == 0) { break; } } + __instance.GetType().GetMethod("MoveToSocket", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { occupiedSocket }); __result = false; return false; @@ -158,6 +161,7 @@ namespace QSB.QuantumSync.Patches DebugLog.ToConsole($"Error - Trying to move {__instance.name} to a null socket!", MessageType.Error); return; } + var objectWorldObject = QSBWorldSync.GetWorldFromUnity(__instance); var socketWorldObject = QSBWorldSync.GetWorldFromUnity(socket); @@ -206,7 +210,6 @@ namespace QSB.QuantumSync.Patches ____indexList[random] = temp; } - for (var j = 0; j < ____shuffledObjects.Length; j++) { ____shuffledObjects[j].localPosition = ____localPositions[____indexList[j]]; @@ -249,6 +252,7 @@ namespace QSB.QuantumSync.Patches { __instance.GetType().GetMethod("CheckEnabled", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null); } + if (____collapseOnStart) { __instance.GetType().GetMethod("Collapse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { true }); @@ -269,6 +273,7 @@ namespace QSB.QuantumSync.Patches { return true; } + var isInControl = qsbObj.ControllingPlayer == QSBPlayerManager.LocalPlayerId; return isInControl; } @@ -284,6 +289,7 @@ namespace QSB.QuantumSync.Patches { return; } + var allMultiStates = QSBWorldSync.GetWorldObjects(); var stateObject = QSBWorldSync.GetWorldFromUnity(__instance); var owner = allMultiStates.First(x => x.QuantumStates.Contains(stateObject)); @@ -291,6 +297,7 @@ namespace QSB.QuantumSync.Patches { return; } + var stateIndex = owner.QuantumStates.IndexOf(stateObject); QSBEventManager.FireEvent( EventNames.QSBMultiStateChange, @@ -369,6 +376,7 @@ namespace QSB.QuantumSync.Patches { ____isProbeInside = true; } + return false; } @@ -390,6 +398,7 @@ namespace QSB.QuantumSync.Patches { ____isProbeInside = false; } + return false; } @@ -445,6 +454,7 @@ namespace QSB.QuantumSync.Patches { __instance.GetType().GetMethod("Collapse", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { true }); } + __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 }); QSBEventManager.FireEvent("PlayerExitQuantumMoon"); } @@ -458,6 +468,7 @@ namespace QSB.QuantumSync.Patches { Physics.SyncTransforms(); } + var component = Locator.GetPlayerCamera().GetComponent(); component.SetDegreesY(component.GetMinDegreesY()); ____vortexAudio.SetLocalVolume(0f); @@ -466,6 +477,7 @@ namespace QSB.QuantumSync.Patches } } } + ____playerFogBubble.SetFogAlpha(fogAlpha); ____shipLandingCamFogBubble.SetFogAlpha(fogAlpha); return false; diff --git a/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs b/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs index 3b85247b..05b840e0 100644 --- a/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs +++ b/QSB/QuantumSync/Patches/QuantumVisibilityPatches.cs @@ -63,6 +63,7 @@ namespace QSB.QuantumSync.Patches __result = true; return false; } + var point = __instance.transform.TransformPoint(____localIlluminationOffset); var tupleFlashlights = QSBPlayerManager.GetPlayerFlashlights(); var localFlashlight = tupleFlashlights.First; @@ -107,6 +108,7 @@ namespace QSB.QuantumSync.Patches } } } + __result = false; return false; } diff --git a/QSB/QuantumSync/Patches/ServerQuantumPatches.cs b/QSB/QuantumSync/Patches/ServerQuantumPatches.cs index 77cd8548..7e4c8d26 100644 --- a/QSB/QuantumSync/Patches/ServerQuantumPatches.cs +++ b/QSB/QuantumSync/Patches/ServerQuantumPatches.cs @@ -69,6 +69,7 @@ namespace QSB.QuantumSync.Patches DebugLog.ToConsole($"Warning - QuantumManager.Shrine is null.", MessageType.Warning); return false; } + var shrineLit = QuantumManager.Shrine.IsPlayerInDarkness(); // If any of the players in the moon are not in the shrine @@ -98,16 +99,19 @@ namespace QSB.QuantumSync.Patches __result = false; return false; } + if (Time.time - ____playerWarpTime < 1f) { __result = false; return false; } + if (____stateIndex == 5 && ____isPlayerInside && !__instance.IsPlayerEntangled()) { __result = false; return false; } + for (var i = 0; i < 10; i++) { var stateIndex = (____collapseToIndex == -1) ? (int)__instance.GetType().GetMethod("GetRandomStateIndex", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, null) : ____collapseToIndex; @@ -120,10 +124,12 @@ namespace QSB.QuantumSync.Patches break; } } + if (orbitIndex == -1) { DebugLog.ToConsole($"Error - QM failed to find orbit for state {stateIndex}", MessageType.Error); } + var orbitRadius = (orbitIndex == -1) ? 10000f : ____orbits[orbitIndex].GetOrbitRadius(); var owRigidbody = (orbitIndex == -1) ? Locator.GetAstroObject(AstroObject.Name.Sun).GetOWRigidbody() : ____orbits[orbitIndex].GetAttachedOWRigidbody(); var onUnitSphere = UnityEngine.Random.onUnitSphere; @@ -132,6 +138,7 @@ namespace QSB.QuantumSync.Patches onUnitSphere.y = 0f; onUnitSphere.Normalize(); } + var position = (onUnitSphere * orbitRadius) + owRigidbody.GetWorldCenterOfMass(); if (!Physics.CheckSphere(position, ____sphereCheckRadius, OWLayerMask.physicalMask) || ____collapseToIndex != -1) { @@ -140,6 +147,7 @@ namespace QSB.QuantumSync.Patches { Physics.SyncTransforms(); } + if (__instance.IsPlayerEntangled() || !QuantumManager.IsVisibleUsingCameraFrustum((ShapeVisibilityTracker)____visibilityTracker, skipInstantVisibilityCheck).First) { ____moonBody.transform.position = position; @@ -147,6 +155,7 @@ namespace QSB.QuantumSync.Patches { Physics.SyncTransforms(); } + ____visibilityTracker.transform.localPosition = Vector3.zero; ____constantForceDetector.AddConstantVolume(owRigidbody.GetAttachedGravityVolume(), true, true); var velocity = owRigidbody.GetVelocity(); @@ -156,6 +165,7 @@ namespace QSB.QuantumSync.Patches velocity = (initialMotion == null) ? Vector3.zero : initialMotion.GetInitVelocity(); ____useInitialMotion = false; } + var orbitAngle = UnityEngine.Random.Range(0, 360); ____moonBody.SetVelocity(OWPhysics.CalculateOrbitVelocity(owRigidbody, ____moonBody, orbitAngle) + velocity); ____lastStateIndex = ____stateIndex; @@ -166,9 +176,11 @@ namespace QSB.QuantumSync.Patches { ____stateSkipCounts[k] = (k != ____stateIndex) ? (____stateSkipCounts[k] + 1) : 0; } + QSBEventManager.FireEvent(EventNames.QSBMoonStateChange, stateIndex, onUnitSphere, orbitAngle); break; } + ____visibilityTracker.transform.localPosition = Vector3.zero; } else @@ -176,6 +188,7 @@ namespace QSB.QuantumSync.Patches DebugLog.ToConsole("Warning - Quantum moon orbit position occupied! Aborting collapse.", MessageType.Warning); } } + if (flag) { if (____isPlayerInside) @@ -187,16 +200,19 @@ namespace QSB.QuantumSync.Patches __instance.GetType().GetMethod("SetSurfaceState", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { -1 }); ____quantumSignal.SetSignalActivation(____stateIndex != 5, 2f); } + ____referenceFrameVolume.gameObject.SetActive(____stateIndex != 5); ____moonBody.SetIsTargetable(____stateIndex != 5); for (var l = 0; l < ____deactivateAtEye.Length; l++) { ____deactivateAtEye[l].SetActive(____stateIndex != 5); } + GlobalMessenger.FireEvent("QuantumMoonChangeState", ____moonBody); __result = true; return false; } + __result = false; return false; } diff --git a/QSB/QuantumSync/QuantumManager.cs b/QSB/QuantumSync/QuantumManager.cs index e0d84cd9..ee255d8b 100644 --- a/QSB/QuantumSync/QuantumManager.cs +++ b/QSB/QuantumSync/QuantumManager.cs @@ -51,6 +51,7 @@ namespace QSB.QuantumSync { return; } + var quantumObjects = QSBWorldSync.GetWorldObjects().ToList(); for (var i = 0; i < quantumObjects.Count; i++) { @@ -84,10 +85,12 @@ namespace QSB.QuantumSync DebugLog.ToConsole($"Warning - Trying to run IsVisibleUsingCameraFrustum when there are no players!", MessageType.Warning); return new Tuple>(false, null); } + if (!tracker.gameObject.activeInHierarchy) { return new Tuple>(false, null); } + var frustumMethod = tracker.GetType().GetMethod("IsInFrustum", BindingFlags.NonPublic | BindingFlags.Instance); var playersWhoCanSee = new List(); @@ -99,6 +102,7 @@ namespace QSB.QuantumSync DebugLog.ToConsole($"Warning - Camera is null for id:{player.PlayerId}!", MessageType.Warning); continue; } + var isInFrustum = (bool)frustumMethod.Invoke(tracker, new object[] { player.Camera.GetFrustumPlanes() }); if (isInFrustum) { @@ -124,6 +128,7 @@ namespace QSB.QuantumSync { return Enumerable.Empty(); } + var worldObj = GetObject(obj); return QSBPlayerManager.PlayerList.Where(x => x.EntangledObject == worldObj); } @@ -155,6 +160,7 @@ namespace QSB.QuantumSync { DebugLog.ToConsole($"Warning - couldn't work out type of QuantumObject {unityObject.name}.", MessageType.Warning); } + return worldObj; } } diff --git a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs index c9997caa..ce6ec74c 100644 --- a/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBMultiStateQuantumObject.cs @@ -31,6 +31,7 @@ namespace QSB.QuantumSync.WorldObjects { DebugBoxText = DebugBoxManager.CreateBox(AttachedObject.transform, 0, CurrentState.ToString()).GetComponent(); } + base.Init(attachedObject, id); } @@ -40,6 +41,7 @@ namespace QSB.QuantumSync.WorldObjects { QuantumStates[CurrentState].SetVisible(false); } + QuantumStates[newStateIndex].SetVisible(true); AttachedObject.SetValue("_stateIndex", newStateIndex); if (QSBCore.DebugMode) diff --git a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs index 5cd253a1..c46c809b 100644 --- a/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBQuantumObject.cs @@ -43,6 +43,7 @@ namespace QSB.QuantumSync.WorldObjects shape.OnShapeDeactivated += (Shape s) => QSBCore.UnityEvents.FireOnNextUpdate(() => OnDisable(s)); } + if (GetAttachedShapes().Any(x => !x.enabled || !x.active)) { ControllingPlayer = 0u; @@ -60,22 +61,26 @@ namespace QSB.QuantumSync.WorldObjects { return new List(); } + var visibilityTrackers = AttachedObject.GetValue("_visibilityTrackers"); if (visibilityTrackers == null || visibilityTrackers.Length == 0) { return new List(); } + if (visibilityTrackers.Any(x => x.GetType() == typeof(RendererVisibilityTracker))) { DebugLog.ToConsole($"Warning - {AttachedObject.name} has a RendererVisibilityTracker!", MessageType.Warning); return new List(); } + var totalShapes = new List(); foreach (var tracker in visibilityTrackers) { var shapes = tracker.GetValue("_shapes"); totalShapes.AddRange(shapes); } + return totalShapes; } @@ -86,11 +91,13 @@ namespace QSB.QuantumSync.WorldObjects { return; } + if (ControllingPlayer != 0) { // controlled by another player, dont care that we activate it return; } + var id = QSBWorldSync.GetIdFromTypeSubset(this); // no one is controlling this object right now, request authority QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, QSBPlayerManager.LocalPlayerId); @@ -102,20 +109,24 @@ namespace QSB.QuantumSync.WorldObjects { return; } + if (GetAttachedShapes().Any(x => x.isActiveAndEnabled)) { return; } + IsEnabled = false; if (!QSBCore.WorldObjectsReady && !QSBCore.IsServer) { return; } + if (ControllingPlayer != QSBPlayerManager.LocalPlayerId) { // not being controlled by us, don't care if we leave area return; } + var id = QSBWorldSync.GetIdFromTypeSubset(this); // send event to other players that we're releasing authority QSBEventManager.FireEvent(EventNames.QSBQuantumAuthority, id, 0u); diff --git a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs index 0b7117a4..57d18d4c 100644 --- a/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs +++ b/QSB/QuantumSync/WorldObjects/QSBSocketedQuantumObject.cs @@ -41,6 +41,7 @@ namespace QSB.QuantumSync.WorldObjects DebugLog.ToConsole($"Couldn't find socket id {message.SocketId}", MessageType.Error); return; } + var socket = qsbSocket.AttachedObject; if (socket == null) { diff --git a/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs b/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs index ff3e72b6..b9bdcfd3 100644 --- a/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs +++ b/QSB/RoastingSync/Events/EnterExitRoastingEvent.cs @@ -30,6 +30,7 @@ namespace QSB.RoastingSync.Events SendEvent(CreateMessage(-1, roasting)); return; } + var qsbObj = QSBWorldSync.GetWorldFromUnity(campfire); SendEvent(CreateMessage(qsbObj.ObjectId, roasting)); } @@ -47,11 +48,13 @@ namespace QSB.RoastingSync.Events { return; } + if (message.State && message.ObjectId == -1) { DebugLog.ToConsole($"Error - Null campfire supplied for start roasting event!", OWML.Common.MessageType.Error); return; } + var player = QSBPlayerManager.GetPlayer(message.AboutId); player.RoastingStick.SetActive(message.State); if (message.State) diff --git a/QSB/RoastingSync/Events/MarshmallowEventEvent.cs b/QSB/RoastingSync/Events/MarshmallowEventEvent.cs index 2676efaa..60717938 100644 --- a/QSB/RoastingSync/Events/MarshmallowEventEvent.cs +++ b/QSB/RoastingSync/Events/MarshmallowEventEvent.cs @@ -29,12 +29,14 @@ namespace QSB.RoastingSync.Events { return; } + var marshmallow = QSBPlayerManager.GetPlayer(message.AboutId).Marshmallow; if (marshmallow == null) { DebugLog.ToConsole($"Warning - Marshmallow is null for player {message.AboutId}.", OWML.Common.MessageType.Warning); return; } + switch (message.EnumValue) { case MarshmallowEventType.Burn: @@ -73,6 +75,7 @@ namespace QSB.RoastingSync.Events DebugLog.DebugWrite($"Error - Campfire for {playerId} is null.", OWML.Common.MessageType.Error); return; } + rigidbody.SetVelocity(player.Campfire.AttachedObject.GetAttachedOWRigidbody(false).GetPointVelocity(stickTip.position) + (stickTip.forward * 3f)); rigidbody.SetAngularVelocity(stickTip.right * 10f); if (player.Marshmallow == null) @@ -80,6 +83,7 @@ namespace QSB.RoastingSync.Events DebugLog.DebugWrite($"Error - Marshmallow for {playerId} is null.", OWML.Common.MessageType.Error); return; } + tossedMallow.GetComponentInChildren().material.color = player.Marshmallow._burntColor; } } diff --git a/QSB/RoastingSync/Patches/RoastingPatches.cs b/QSB/RoastingSync/Patches/RoastingPatches.cs index 5f12fe8c..d4adaa84 100644 --- a/QSB/RoastingSync/Patches/RoastingPatches.cs +++ b/QSB/RoastingSync/Patches/RoastingPatches.cs @@ -39,6 +39,7 @@ namespace QSB.RoastingSync.Patches ____audioController.PlayMarshmallowCatchFire(); QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Burn); } + return false; } @@ -52,6 +53,7 @@ namespace QSB.RoastingSync.Patches ____mallowState = Marshmallow.MallowState.Shriveling; QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Shrivel); } + return false; } @@ -107,6 +109,7 @@ namespace QSB.RoastingSync.Patches QSBEventManager.FireEvent(EventNames.QSBMarshmallowEvent, MarshmallowEventType.Toss); } } + if (OWInput.IsNewlyPressed(InputLibrary.interact, InputMode.Roasting) && ____marshmallow.IsEdible()) { ____marshmallow.Eat(); diff --git a/QSB/RoastingSync/QSBMarshmallow.cs b/QSB/RoastingSync/QSBMarshmallow.cs index 9eb081df..b080e97e 100644 --- a/QSB/RoastingSync/QSBMarshmallow.cs +++ b/QSB/RoastingSync/QSBMarshmallow.cs @@ -83,9 +83,11 @@ namespace QSB.RoastingSync { _fireRenderer.enabled = false; } + transform.localScale = Vector3.one * (1f - shrivelFraction); } } + _heatPerSecond = 0f; } @@ -105,6 +107,7 @@ namespace QSB.RoastingSync { _smokeParticles.Play(); } + var smokeColor = new Color(1f, 1f, 1f, num); _smokeParticlesSettings.startColor = smokeColor; } @@ -112,6 +115,7 @@ namespace QSB.RoastingSync { _smokeParticles.Stop(); } + Color newColor; if (_toastedFraction < PERFECT_TOASTED_FRACTION) { @@ -123,6 +127,7 @@ namespace QSB.RoastingSync var fractionTowardsBurnt = (_toastedFraction - PERFECT_TOASTED_FRACTION) / 0.3f; newColor = Color.Lerp(_toastedColor, _burntColor, fractionTowardsBurnt); } + _mallowRenderer.material.color = Color.Lerp(_mallowRenderer.material.color, newColor, RAW_TOASTED_FRACTION); _smokeParticles.transform.forward = Locator.GetPlayerTransform().up; } diff --git a/QSB/SectorSync/QSBSectorManager.cs b/QSB/SectorSync/QSBSectorManager.cs index be9ea06d..895981c7 100644 --- a/QSB/SectorSync/QSBSectorManager.cs +++ b/QSB/SectorSync/QSBSectorManager.cs @@ -30,6 +30,7 @@ namespace QSB.SectorSync { continue; } + if ((sync as QNetworkBehaviour).HasAuthority && sync.AttachedObject.gameObject.activeInHierarchy && sync.IsReady) @@ -44,6 +45,7 @@ namespace QSB.SectorSync { continue; } + if ((sync as QNetworkBehaviour).HasAuthority && sync.AttachedObject.gameObject.activeInHierarchy && sync.IsReady) @@ -78,6 +80,7 @@ namespace QSB.SectorSync DebugLog.ToConsole($"Error - TimeLoopRing_Body not found!", MessageType.Error); } } + QSBWorldSync.Init(); IsReady = QSBWorldSync.GetWorldObjects().Any(); } @@ -91,10 +94,12 @@ namespace QSB.SectorSync { return; } + if (closestSector == transformSync.ReferenceSector) { return; } + transformSync.SetReferenceSector(closestSector); } } diff --git a/QSB/SectorSync/SectorSync.cs b/QSB/SectorSync/SectorSync.cs index 9d75e044..65795145 100644 --- a/QSB/SectorSync/SectorSync.cs +++ b/QSB/SectorSync/SectorSync.cs @@ -34,6 +34,7 @@ namespace QSB.SectorSync _sectorDetector.OnEnterSector -= AddSector; _sectorDetector.OnExitSector -= RemoveSector; } + _sectorDetector = detector; _sectorDetector.OnEnterSector += AddSector; _sectorDetector.OnExitSector += RemoveSector; @@ -54,11 +55,13 @@ namespace QSB.SectorSync { DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error); } + if (SectorList.Contains(worldObject)) { DebugLog.ToConsole($"Warning - Trying to add {sector.name} for {gameObject.name}, but is already in list", MessageType.Warning); return; } + SectorList.Add(worldObject); } @@ -70,11 +73,13 @@ namespace QSB.SectorSync DebugLog.ToConsole($"Error - Can't find QSBSector for sector {sector.name}!", MessageType.Error); return; } + if (!SectorList.Contains(worldObject)) { DebugLog.ToConsole($"Warning - Trying to remove {sector.name} for {gameObject.name}, but is not in list!", MessageType.Warning); return; } + SectorList.Remove(worldObject); } @@ -98,6 +103,7 @@ namespace QSB.SectorSync { return default; } + var ordered = activeNotNullNotBlacklisted .OrderBy(sector => CalculateSectorScore(sector, trans, _attachedOWRigidbody)); @@ -140,6 +146,7 @@ namespace QSB.SectorSync return trigger.GetShape().CalcWorldBounds().radius; } } + return 0f; } @@ -152,6 +159,7 @@ namespace QSB.SectorSync var relativeVelocityMagnitude = relativeVelocity.sqrMagnitude; // Remember this is squared for efficiency! return relativeVelocityMagnitude; } + return 0; } } diff --git a/QSB/SectorSync/WorldObjects/QSBSector.cs b/QSB/SectorSync/WorldObjects/QSBSector.cs index 8ad81354..c0be4c60 100644 --- a/QSB/SectorSync/WorldObjects/QSBSector.cs +++ b/QSB/SectorSync/WorldObjects/QSBSector.cs @@ -60,6 +60,7 @@ namespace QSB.SectorSync.WorldObjects DebugLog.ToConsole($"Warning - Expected to find a NomaiShuttleController for {AttachedObject.name}!", MessageType.Warning); return false; } + if (!shuttleController.IsPlayerInside()) { return false; @@ -73,12 +74,14 @@ namespace QSB.SectorSync.WorldObjects DebugLog.ToConsole($"Warning - Expected to find a EyeShuttleController for {AttachedObject.name}!", MessageType.Warning); return false; } + if (!shuttleController.GetValue("_isPlayerInside")) { return false; } } } + return true; } } diff --git a/QSB/ShipSync/Events/FlyShipEvent.cs b/QSB/ShipSync/Events/FlyShipEvent.cs index 029b0ce5..6d2e017b 100644 --- a/QSB/ShipSync/Events/FlyShipEvent.cs +++ b/QSB/ShipSync/Events/FlyShipEvent.cs @@ -75,6 +75,7 @@ namespace QSB.ShipSync.Events { shipNetId.RemoveClientAuthority(shipNetId.ClientAuthorityOwner); } + shipNetId.AssignClientAuthority(newAuthority); } } diff --git a/QSB/ShipSync/Patches/ShipPatches.cs b/QSB/ShipSync/Patches/ShipPatches.cs index 675f7056..9f012381 100644 --- a/QSB/ShipSync/Patches/ShipPatches.cs +++ b/QSB/ShipSync/Patches/ShipPatches.cs @@ -25,6 +25,7 @@ namespace QSB.ShipSync.Patches ShipManager.Instance.ShipTractorBeam.ActivateTractorBeam(); QSBEventManager.FireEvent(EventNames.QSBEnableFunnel); } + QSBEventManager.FireEvent(EventNames.QSBHatchState, true); return true; } @@ -35,6 +36,7 @@ namespace QSB.ShipSync.Patches { QSBEventManager.FireEvent(EventNames.QSBHatchState, false); } + return true; } @@ -46,6 +48,7 @@ namespace QSB.ShipSync.Patches ShipManager.Instance.ShipTractorBeam.DeactivateTractorBeam(); QSBEventManager.FireEvent(EventNames.QSBHatchState, false); } + return false; } diff --git a/QSB/ShipSync/ShipManager.cs b/QSB/ShipSync/ShipManager.cs index aee3d882..183c11f2 100644 --- a/QSB/ShipSync/ShipManager.cs +++ b/QSB/ShipSync/ShipManager.cs @@ -28,6 +28,7 @@ namespace QSB.ShipSync { DebugLog.ToConsole($"Warning - Trying to set current flyer while someone is still flying? Current:{_currentFlyer}, New:{value}", MessageType.Warning); } + _currentFlyer = value; } } @@ -55,6 +56,7 @@ namespace QSB.ShipSync { QNetworkServer.Destroy(ShipTransformSync.LocalInstance.gameObject); } + QNetworkServer.Spawn(Instantiate(QSBNetworkManager.Instance.ShipPrefab)); } diff --git a/QSB/StatueSync/Patches/StatuePatches.cs b/QSB/StatueSync/Patches/StatuePatches.cs index f485eb5f..bce3385a 100644 --- a/QSB/StatueSync/Patches/StatuePatches.cs +++ b/QSB/StatueSync/Patches/StatuePatches.cs @@ -18,10 +18,12 @@ namespace QSB.StatueSync.Patches { return true; } + if (!____waitForPlayerGrounded || !Locator.GetPlayerController().IsGrounded()) { return true; } + var playerBody = Locator.GetPlayerBody().transform; var timberHearth = Locator.GetAstroObject(AstroObject.Name.TimberHearth).transform; QSBEventManager.FireEvent( diff --git a/QSB/Syncs/IntermediaryTransform.cs b/QSB/Syncs/IntermediaryTransform.cs index afbf10f4..43beae33 100644 --- a/QSB/Syncs/IntermediaryTransform.cs +++ b/QSB/Syncs/IntermediaryTransform.cs @@ -69,6 +69,7 @@ namespace QSB.Syncs DebugLog.DebugWrite($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); return; } + SetRotation(_referenceTransform.InverseTransformRotation(worldRotation)); } @@ -94,6 +95,7 @@ namespace QSB.Syncs DebugLog.DebugWrite($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); return Vector3.zero; } + return _referenceTransform.TransformPoint(GetPosition()); } @@ -107,6 +109,7 @@ namespace QSB.Syncs DebugLog.DebugWrite($"Error - _referenceTransform has not been set for {_attachedTransform.name}", MessageType.Error); return Quaternion.identity; } + return _referenceTransform.TransformRotation(GetRotation()); } } diff --git a/QSB/Syncs/RigidbodySync/SectoredRigidbodySync.cs b/QSB/Syncs/RigidbodySync/SectoredRigidbodySync.cs index abc1c1a0..98fbff22 100644 --- a/QSB/Syncs/RigidbodySync/SectoredRigidbodySync.cs +++ b/QSB/Syncs/RigidbodySync/SectoredRigidbodySync.cs @@ -35,6 +35,7 @@ namespace QSB.Syncs.RigidbodySync { return; } + var closestSector = SectorSync.GetClosestSector(AttachedObject.transform); if (closestSector != null) { @@ -48,6 +49,7 @@ namespace QSB.Syncs.RigidbodySync { _intermediaryTransform = new IntermediaryTransform(transform); } + if (ReferenceSector != null) { writer.Write(ReferenceSector.ObjectId); @@ -56,6 +58,7 @@ namespace QSB.Syncs.RigidbodySync { writer.Write(-1); } + base.SerializeTransform(writer); } diff --git a/QSB/Syncs/RigidbodySync/UnparentedBaseRigidbodySync.cs b/QSB/Syncs/RigidbodySync/UnparentedBaseRigidbodySync.cs index 59aca538..fed7cf8e 100644 --- a/QSB/Syncs/RigidbodySync/UnparentedBaseRigidbodySync.cs +++ b/QSB/Syncs/RigidbodySync/UnparentedBaseRigidbodySync.cs @@ -49,6 +49,7 @@ namespace QSB.Syncs.RigidbodySync { DebugLog.ToConsole($"Error - {_logName} is being init-ed when not in the universe!", MessageType.Error); } + AttachedObject = GetRigidbody(); _isInitialized = true; } @@ -223,6 +224,7 @@ namespace QSB.Syncs.RigidbodySync { return; } + ReferenceTransform = transform; _intermediaryTransform.SetReferenceTransform(transform); } @@ -237,6 +239,7 @@ namespace QSB.Syncs.RigidbodySync _previousDistance = distance; return targetPosition; } + _previousDistance = distance; return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); } @@ -281,17 +284,20 @@ namespace QSB.Syncs.RigidbodySync DebugLog.ToConsole($"Error - Trying to get relative velocity when AttachedObject is null.", MessageType.Error); return Vector3.zero; } + if (ReferenceTransform == null) { DebugLog.ToConsole($"Error - Trying to get relative velocity when ReferenceTransform is null. ({AttachedObject.name})", MessageType.Error); return Vector3.zero; } + var attachedRigid = ReferenceTransform.GetAttachedOWRigidbody(); if (attachedRigid == null) { DebugLog.ToConsole($"Error - ReferenceTransform ({ReferenceTransform.name}) on {AttachedObject.name} has no attached OWRigidBody.", MessageType.Error); return Vector3.zero; } + var pointVelocity = attachedRigid.GetPointVelocity(AttachedObject.transform.position); return AttachedObject.GetVelocity() - pointVelocity; } diff --git a/QSB/Syncs/TransformSync/BaseTransformSync.cs b/QSB/Syncs/TransformSync/BaseTransformSync.cs index 6f9edc95..835bedfc 100644 --- a/QSB/Syncs/TransformSync/BaseTransformSync.cs +++ b/QSB/Syncs/TransformSync/BaseTransformSync.cs @@ -83,6 +83,7 @@ namespace QSB.Syncs.TransformSync { Destroy(AttachedObject.gameObject); } + QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; } @@ -95,10 +96,12 @@ namespace QSB.Syncs.TransformSync { DebugLog.ToConsole($"Error - {_logName} is being init-ed when not in the universe!", MessageType.Error); } + if (!HasAuthority && AttachedObject != null) { Destroy(AttachedObject.gameObject); } + AttachedObject = HasAuthority ? InitLocalTransform() : InitRemoteTransform(); _isInitialized = true; } @@ -195,6 +198,7 @@ namespace QSB.Syncs.TransformSync _intermediaryTransform.EncodeRotation(AttachedObject.transform.rotation); return; } + var targetPos = _intermediaryTransform.GetTargetPosition_ParentedToReference(); var targetRot = _intermediaryTransform.GetTargetRotation_ParentedToReference(); if (targetPos != Vector3.zero && _intermediaryTransform.GetTargetPosition_Unparented() != Vector3.zero) @@ -225,6 +229,7 @@ namespace QSB.Syncs.TransformSync { return; } + ReferenceTransform = transform; _intermediaryTransform.SetReferenceTransform(transform); if (AttachedObject == null) @@ -235,6 +240,7 @@ namespace QSB.Syncs.TransformSync () => ReparentAttachedObject(transform)); return; } + if (!HasAuthority) { ReparentAttachedObject(transform); @@ -247,6 +253,7 @@ namespace QSB.Syncs.TransformSync { DebugLog.ToConsole($"Warning - Trying to reparent AttachedObject {AttachedObject.name} which wasnt attached to sector!", MessageType.Warning); } + AttachedObject.transform.SetParent(sectorTransform, true); AttachedObject.transform.localScale = GetType() == typeof(PlayerTransformSync) ? Vector3.one / 10 @@ -261,6 +268,7 @@ namespace QSB.Syncs.TransformSync _previousDistance = distance; return targetPosition; } + _previousDistance = distance; return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); } diff --git a/QSB/Syncs/TransformSync/SectoredTransformSync.cs b/QSB/Syncs/TransformSync/SectoredTransformSync.cs index ac5aa495..609ce44b 100644 --- a/QSB/Syncs/TransformSync/SectoredTransformSync.cs +++ b/QSB/Syncs/TransformSync/SectoredTransformSync.cs @@ -36,6 +36,7 @@ namespace QSB.Syncs.TransformSync { return; } + var closestSector = SectorSync.GetClosestSector(AttachedObject.transform); if (closestSector != null) { @@ -49,6 +50,7 @@ namespace QSB.Syncs.TransformSync { _intermediaryTransform = new IntermediaryTransform(transform); } + if (ReferenceSector != null) { writer.Write(ReferenceSector.ObjectId); @@ -57,6 +59,7 @@ namespace QSB.Syncs.TransformSync { writer.Write(-1); } + base.SerializeTransform(writer); } diff --git a/QSB/Syncs/TransformSync/UnparentedBaseTransformSync.cs b/QSB/Syncs/TransformSync/UnparentedBaseTransformSync.cs index ae91b965..6a0fa7e7 100644 --- a/QSB/Syncs/TransformSync/UnparentedBaseTransformSync.cs +++ b/QSB/Syncs/TransformSync/UnparentedBaseTransformSync.cs @@ -77,6 +77,7 @@ namespace QSB.Syncs.TransformSync { Destroy(AttachedObject.gameObject); } + QSBSceneManager.OnSceneLoaded -= OnSceneLoaded; } @@ -176,6 +177,7 @@ namespace QSB.Syncs.TransformSync _intermediaryTransform.EncodeRotation(AttachedObject.transform.rotation); return; } + var targetPos = _intermediaryTransform.GetTargetPosition_Unparented(); var targetRot = _intermediaryTransform.GetTargetRotation_Unparented(); if (targetPos != Vector3.zero && _intermediaryTransform.GetTargetPosition_ParentedToReference() != Vector3.zero) @@ -206,6 +208,7 @@ namespace QSB.Syncs.TransformSync { return; } + ReferenceTransform = transform; _intermediaryTransform.SetReferenceTransform(transform); } @@ -220,6 +223,7 @@ namespace QSB.Syncs.TransformSync _previousDistance = distance; return targetPosition; } + _previousDistance = distance; return Vector3.SmoothDamp(currentPosition, targetPosition, ref _positionSmoothVelocity, SmoothTime); } diff --git a/QSB/TimeSync/TimeSyncUI.cs b/QSB/TimeSync/TimeSyncUI.cs index 68a8bf09..6932d837 100644 --- a/QSB/TimeSync/TimeSyncUI.cs +++ b/QSB/TimeSync/TimeSyncUI.cs @@ -72,6 +72,7 @@ namespace QSB.TimeSync { return; } + var totalSeconds = Mathf.Max(TargetTime - Time.timeSinceLevelLoad, 0f); var minutes = Mathf.FloorToInt(totalSeconds / 60f); var seconds = Mathf.FloorToInt(totalSeconds) % 60; @@ -92,6 +93,7 @@ namespace QSB.TimeSync text = "Waiting for server..."; break; } + _text.text = text; } } diff --git a/QSB/TimeSync/WakeUpSync.cs b/QSB/TimeSync/WakeUpSync.cs index fb0d27b5..19f3b10f 100644 --- a/QSB/TimeSync/WakeUpSync.cs +++ b/QSB/TimeSync/WakeUpSync.cs @@ -45,6 +45,7 @@ namespace QSB.TimeSync _isFirstFastForward = false; Init(); } + QSBSceneManager.OnSceneLoaded += OnSceneLoaded; GlobalMessenger.AddListener(EventNames.WakeUp, OnWakeUp); @@ -63,6 +64,7 @@ namespace QSB.TimeSync { RespawnOnDeath.Instance.Init(); } + _hasWokenUp = true; } @@ -81,6 +83,7 @@ namespace QSB.TimeSync { _hasWokenUp = true; } + Init(); } else @@ -148,6 +151,7 @@ namespace QSB.TimeSync { return; } + DebugLog.DebugWrite($"START WAITING FOR SERVER LOOP", MessageType.Info); OWTime.SetTimeScale(0f); _state = State.WaitingForServerToDie; @@ -161,6 +165,7 @@ namespace QSB.TimeSync TimeSyncUI.TargetTime = _serverTime; return; } + DebugLog.DebugWrite($"START FASTFORWARD (Target:{_serverTime} Current:{Time.timeSinceLevelLoad})", MessageType.Info); if (Locator.GetActiveCamera() != null) { @@ -183,6 +188,7 @@ namespace QSB.TimeSync { return; } + DebugLog.DebugWrite($"START PAUSING (Target:{_serverTime} Current:{Time.timeSinceLevelLoad})", MessageType.Info); Locator.GetActiveCamera().enabled = false; @@ -265,6 +271,7 @@ namespace QSB.TimeSync { Locator.GetPlayerCamera().enabled = false; } + var diff = _serverTime - Time.timeSinceLevelLoad; OWTime.SetTimeScale(Mathf.SmoothStep(MinFastForwardSpeed, MaxFastForwardSpeed, Mathf.Abs(diff) / MaxFastForwardDiff)); @@ -308,11 +315,13 @@ namespace QSB.TimeSync DebugLog.ToConsole($"Warning - CheckTimeDifference() returned over 100 - should have switched into fast-forward!", MessageType.Warning); mappedTimescale = 0f; } + if (mappedTimescale < 0) { DebugLog.ToConsole($"Warning - CheckTimeDifference() returned below 0 - should have switched into pausing!", MessageType.Warning); mappedTimescale = 0f; } + OWTime.SetTimeScale(mappedTimescale); } } diff --git a/QSB/Tools/QSBFlashlight.cs b/QSB/Tools/QSBFlashlight.cs index 1ab51a70..b4d47e45 100644 --- a/QSB/Tools/QSBFlashlight.cs +++ b/QSB/Tools/QSBFlashlight.cs @@ -33,6 +33,7 @@ namespace QSB.Tools light.GetLight().enabled = false; light.GetLight().shadows = LightShadows.Soft; } + FlashlightOn = false; } @@ -54,10 +55,12 @@ namespace QSB.Tools { return; } + foreach (var light in _lights) { light.GetLight().enabled = true; } + FlashlightOn = true; var rotation = _root.rotation; _basePivot.rotation = rotation; @@ -71,10 +74,12 @@ namespace QSB.Tools { return; } + foreach (var light in _lights) { light.GetLight().enabled = false; } + FlashlightOn = false; } @@ -99,6 +104,7 @@ namespace QSB.Tools { return; } + var light = _lights[1].GetLight(); if (light.enabled) { diff --git a/QSB/Tools/QSBTool.cs b/QSB/Tools/QSBTool.cs index 4a074fa8..08d15018 100644 --- a/QSB/Tools/QSBTool.cs +++ b/QSB/Tools/QSBTool.cs @@ -41,6 +41,7 @@ namespace QSB.Tools EquipTool(); return; } + UnequipTool(); } } diff --git a/QSB/TranslationSync/Events/SetAsTranslatedEvent.cs b/QSB/TranslationSync/Events/SetAsTranslatedEvent.cs index b9385d42..ce613f3c 100644 --- a/QSB/TranslationSync/Events/SetAsTranslatedEvent.cs +++ b/QSB/TranslationSync/Events/SetAsTranslatedEvent.cs @@ -27,6 +27,7 @@ namespace QSB.TranslationSync.Events { return; } + if (message.EnumValue == NomaiTextType.WallText) { var obj = QSBWorldSync.GetWorldFromId(message.ObjectId); diff --git a/QSB/TranslationSync/Patches/SpiralPatches.cs b/QSB/TranslationSync/Patches/SpiralPatches.cs index 91348b9b..b608e0e4 100644 --- a/QSB/TranslationSync/Patches/SpiralPatches.cs +++ b/QSB/TranslationSync/Patches/SpiralPatches.cs @@ -22,6 +22,7 @@ namespace QSB.TranslationSync.Patches { return true; } + QSBEventManager.FireEvent( EventNames.QSBTextTranslated, NomaiTextType.WallText, @@ -36,6 +37,7 @@ namespace QSB.TranslationSync.Patches { return true; } + QSBEventManager.FireEvent( EventNames.QSBTextTranslated, NomaiTextType.Computer, @@ -50,6 +52,7 @@ namespace QSB.TranslationSync.Patches { return true; } + QSBEventManager.FireEvent( EventNames.QSBTextTranslated, NomaiTextType.VesselComputer, diff --git a/QSB/TranslationSync/WorldObjects/QSBComputer.cs b/QSB/TranslationSync/WorldObjects/QSBComputer.cs index 44ae373f..1fb64046 100644 --- a/QSB/TranslationSync/WorldObjects/QSBComputer.cs +++ b/QSB/TranslationSync/WorldObjects/QSBComputer.cs @@ -18,6 +18,7 @@ namespace QSB.TranslationSync.WorldObjects { return; } + AttachedObject.SetAsTranslated(id); } @@ -31,6 +32,7 @@ namespace QSB.TranslationSync.WorldObjects yield return item.GetEntryID(); } } + var inactiveList = AttachedObject.GetValue>("_inactiveRingList"); foreach (var item in inactiveList) { diff --git a/QSB/TranslationSync/WorldObjects/QSBVesselComputer.cs b/QSB/TranslationSync/WorldObjects/QSBVesselComputer.cs index 2903ac7c..d0e56dc4 100644 --- a/QSB/TranslationSync/WorldObjects/QSBVesselComputer.cs +++ b/QSB/TranslationSync/WorldObjects/QSBVesselComputer.cs @@ -19,6 +19,7 @@ namespace QSB.TranslationSync.WorldObjects { return; } + AttachedObject.SetAsTranslated(id); } diff --git a/QSB/TranslationSync/WorldObjects/QSBWallText.cs b/QSB/TranslationSync/WorldObjects/QSBWallText.cs index a1d984de..55b4c614 100644 --- a/QSB/TranslationSync/WorldObjects/QSBWallText.cs +++ b/QSB/TranslationSync/WorldObjects/QSBWallText.cs @@ -19,6 +19,7 @@ namespace QSB.TranslationSync.WorldObjects { return; } + AttachedObject.SetAsTranslated(id); } diff --git a/QSB/Utility/CustomRelativisticParticleSystem.cs b/QSB/Utility/CustomRelativisticParticleSystem.cs index d1190811..ce04f48d 100644 --- a/QSB/Utility/CustomRelativisticParticleSystem.cs +++ b/QSB/Utility/CustomRelativisticParticleSystem.cs @@ -24,6 +24,7 @@ namespace QSB.Utility DebugLog.ToConsole($"Warning - Awake() ran when _isReady is false!", OWML.Common.MessageType.Warning); return; } + _particleSystem = GetComponent(); if (_particleSystem == null) { @@ -31,6 +32,7 @@ namespace QSB.Utility _isReady = false; return; } + _rotation = transform.rotation; _mainModule = _particleSystem.main; _mainModule.simulationSpace = ParticleSystemSimulationSpace.Custom; diff --git a/QSB/Utility/DebugActions.cs b/QSB/Utility/DebugActions.cs index 0cb5c1a5..492d40a4 100644 --- a/QSB/Utility/DebugActions.cs +++ b/QSB/Utility/DebugActions.cs @@ -30,14 +30,17 @@ namespace QSB.Utility { return; } + if (Input.GetKeyDown(KeyCode.Keypad7)) { GoToVessel(); } + if (Input.GetKeyDown(KeyCode.Keypad8)) { InsertWarpCore(); } + if (Input.GetKeyDown(KeyCode.Keypad9)) { LoadManager.LoadSceneAsync(OWScene.EyeOfTheUniverse, true, LoadManager.FadeType.ToWhite); diff --git a/QSB/Utility/DebugBoxManager.cs b/QSB/Utility/DebugBoxManager.cs index bf39c21f..53215a61 100644 --- a/QSB/Utility/DebugBoxManager.cs +++ b/QSB/Utility/DebugBoxManager.cs @@ -17,6 +17,7 @@ namespace QSB.Utility { DebugLog.ToConsole("Error - Font is null!", MessageType.Error); } + _boxPrefab.GetComponent().font = font; _boxPrefab.GetComponent().color = Color.white; } diff --git a/QSB/Utility/DebugLog.cs b/QSB/Utility/DebugLog.cs index 652ad534..065fcc74 100644 --- a/QSB/Utility/DebugLog.cs +++ b/QSB/Utility/DebugLog.cs @@ -15,6 +15,7 @@ namespace QSB.Utility { return; } + var data = new NotificationData(NotificationTarget.Player, message.ToUpper()); NotificationManager.SharedInstance.PostNotification(data); } diff --git a/QSB/Utility/GlobalMessenger4Args.cs b/QSB/Utility/GlobalMessenger4Args.cs index 37dd27b3..0f71dd7c 100644 --- a/QSB/Utility/GlobalMessenger4Args.cs +++ b/QSB/Utility/GlobalMessenger4Args.cs @@ -16,6 +16,7 @@ namespace QSB.Utility eventData = new EventData(); _eventTable.Add(eventType, eventData); } + eventData.Callbacks.Add(handler); } } @@ -48,6 +49,7 @@ namespace QSB.Utility { throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); } + eventData.IsInvoking = true; eventData.Temp.AddRange(eventData.Callbacks); for (var i = 0; i < eventData.Temp.Count; i++) @@ -61,6 +63,7 @@ namespace QSB.Utility DebugLog.ToConsole($"Error - {exception.Message}", MessageType.Error); } } + eventData.Temp.Clear(); eventData.IsInvoking = false; } diff --git a/QSB/Utility/GlobalMessenger5Args.cs b/QSB/Utility/GlobalMessenger5Args.cs index 38fb29dd..31a7e6f1 100644 --- a/QSB/Utility/GlobalMessenger5Args.cs +++ b/QSB/Utility/GlobalMessenger5Args.cs @@ -16,6 +16,7 @@ namespace QSB.Utility eventData = new EventData(); _eventTable.Add(eventType, eventData); } + eventData.Callbacks.Add(handler); } } @@ -48,6 +49,7 @@ namespace QSB.Utility { throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); } + eventData.IsInvoking = true; eventData.Temp.AddRange(eventData.Callbacks); for (var i = 0; i < eventData.Temp.Count; i++) @@ -61,6 +63,7 @@ namespace QSB.Utility DebugLog.ToConsole($"Error - {exception.Message}", MessageType.Error); } } + eventData.Temp.Clear(); eventData.IsInvoking = false; } diff --git a/QSB/Utility/GlobalMessenger6Args.cs b/QSB/Utility/GlobalMessenger6Args.cs index d1a29e50..3caebcaa 100644 --- a/QSB/Utility/GlobalMessenger6Args.cs +++ b/QSB/Utility/GlobalMessenger6Args.cs @@ -16,6 +16,7 @@ namespace QSB.Utility eventData = new EventData(); _eventTable.Add(eventType, eventData); } + eventData.Callbacks.Add(handler); } } @@ -48,6 +49,7 @@ namespace QSB.Utility { throw new InvalidOperationException("GlobalMessenger does not support recursive FireEvent calls to the same eventType."); } + eventData.IsInvoking = true; eventData.Temp.AddRange(eventData.Callbacks); for (var i = 0; i < eventData.Temp.Count; i++) @@ -61,6 +63,7 @@ namespace QSB.Utility DebugLog.ToConsole($"Error - {exception.Message}", MessageType.Error); } } + eventData.Temp.Clear(); eventData.IsInvoking = false; } diff --git a/QSB/Utility/RepeatingManager.cs b/QSB/Utility/RepeatingManager.cs index 334e49b2..b79e21cf 100644 --- a/QSB/Utility/RepeatingManager.cs +++ b/QSB/Utility/RepeatingManager.cs @@ -17,10 +17,12 @@ namespace QSB.Utility { return; } + foreach (var repeat in Repeatings) { repeat.Invoke(); } + _checkTimer = 0; } } diff --git a/QSB/Utility/ZOverride.cs b/QSB/Utility/ZOverride.cs index 8eddd18a..7109dbc4 100644 --- a/QSB/Utility/ZOverride.cs +++ b/QSB/Utility/ZOverride.cs @@ -21,6 +21,7 @@ namespace QSB.Utility { continue; } + Material materialCopy; if (!materialMappings.ContainsKey(material)) { @@ -31,6 +32,7 @@ namespace QSB.Utility { materialCopy = materialMappings[material]; } + materialCopy.SetInt(shaderTestMode, (int)desiredUIComparison); graphic.material = materialCopy; } diff --git a/QSB/WorldSync/QSBWorldSync.cs b/QSB/WorldSync/QSBWorldSync.cs index 3cff38e8..f2bcc82a 100644 --- a/QSB/WorldSync/QSBWorldSync.cs +++ b/QSB/WorldSync/QSBWorldSync.cs @@ -36,6 +36,7 @@ namespace QSB.WorldSync DebugLog.ToConsole($"Warning - Tried to find {typeof(TWorldObject).Name} id {id}. Count is {GetWorldObjects().Count()}.", MessageType.Warning); return default; } + return GetWorldObjects().ToList()[id]; } @@ -48,16 +49,19 @@ namespace QSB.WorldSync DebugLog.ToConsole($"Error - Trying to run GetWorldFromUnity with a null unity object! TWorldObject:{typeof(TWorldObject).Name}, TUnityObject:{typeof(TUnityObject).Name}.", MessageType.Error); return default; } + if (!QSBCore.IsInMultiplayer) { DebugLog.ToConsole($"Warning - Trying to run GetWorldFromUnity while not in multiplayer!"); return default; } + if (!WorldObjectsToUnityObjects.ContainsKey(unityObject)) { DebugLog.ToConsole($"Error - WorldObjectsToUnityObjects does not contain \"{unityObject.name}\"! Called from {new StackTrace().GetFrame(1).GetMethod().Name}", MessageType.Error); return default; } + return WorldObjectsToUnityObjects[unityObject] as TWorldObject; } @@ -73,6 +77,7 @@ namespace QSB.WorldSync { DebugLog.ToConsole($"Warning - {(typeSubset as IWorldObject).Name} doesn't exist in list of {typeof(TTypeSubset).Name} !", MessageType.Warning); } + return index; } @@ -91,6 +96,7 @@ namespace QSB.WorldSync DebugLog.ToConsole($"Error - Exception in OnRemoval() for {item.GetType()}. Message : {e.InnerException.Message}, Stack trace : {e.InnerException.StackTrace}", MessageType.Error); } } + WorldObjects.RemoveAll(x => x is TWorldObject); } @@ -107,6 +113,7 @@ namespace QSB.WorldSync obj.Init(list[id], id); WorldObjectsToUnityObjects.Add(list[id], obj); } + return list; } @@ -126,6 +133,7 @@ namespace QSB.WorldSync { return; } + var delegateList = multiDelegate.GetInvocationList().ToList(); foreach (var del in delegateList) { @@ -140,18 +148,21 @@ namespace QSB.WorldSync { return; } + var qsbSlot = slotList.FirstOrDefault(x => x.AttachedObject == slot); if (qsbSlot == null) { DebugLog.ToConsole($"Error - No QSBOrbSlot found for {slot.name}!", MessageType.Error); return; } + var orbSync = NomaiOrbTransformSync.OrbTransformSyncs.FirstOrDefault(x => x.AttachedObject == affectingOrb.gameObject); if (orbSync == null) { DebugLog.ToConsole($"Error - No NomaiOrbTransformSync found for {affectingOrb.name} (For slot {slot.name})!", MessageType.Error); return; } + if (orbSync.HasAuthority) { qsbSlot.HandleEvent(state, OldOrbList.IndexOf(affectingOrb)); @@ -165,6 +176,7 @@ namespace QSB.WorldSync DebugLog.ToConsole("Warning - Cannot write to condition dict when not server!", MessageType.Warning); return; } + DialogueConditions[name] = state; } @@ -175,10 +187,12 @@ namespace QSB.WorldSync DebugLog.ToConsole("Warning - Cannot write to fact list when not server!", MessageType.Warning); return; } + if (ShipLogFacts.Any(x => x.Id == id)) { return; } + ShipLogFacts.Add(new FactReveal { Id = id, diff --git a/QSB/WorldSync/WorldObjectManager.cs b/QSB/WorldSync/WorldObjectManager.cs index 68c26964..3f5dbf41 100644 --- a/QSB/WorldSync/WorldObjectManager.cs +++ b/QSB/WorldSync/WorldObjectManager.cs @@ -30,6 +30,7 @@ namespace QSB.WorldSync { manager.RebuildWorldObjects(scene); } + AllReady = true; } From 2ea7c56ce343b68651f9d2e89c1274ff0ff7f7d7 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 18 Jun 2021 22:39:21 +0100 Subject: [PATCH 2/3] fix in qnet --- QuantumUNET/Components/QNetworkAnimator.cs | 21 +++++++ QuantumUNET/Components/QNetworkIdentity.cs | 23 +++++++ QuantumUNET/Components/QNetworkManager.cs | 37 ++++++++++++ QuantumUNET/Components/QNetworkManagerHUD.cs | 9 +++ QuantumUNET/Components/QNetworkTransform.cs | 4 ++ .../Components/QNetworkTransformChild.cs | 6 ++ QuantumUNET/Logging/QLog.cs | 5 ++ QuantumUNET/Messages/QMsgType.cs | 2 + QuantumUNET/QClientScene.cs | 18 ++++++ QuantumUNET/QLocalClient.cs | 7 +++ QuantumUNET/QNetworkBehaviour.cs | 21 +++++++ QuantumUNET/QNetworkCRC.cs | 5 ++ QuantumUNET/QNetworkClient.cs | 22 +++++++ QuantumUNET/QNetworkConnection.cs | 15 +++++ QuantumUNET/QNetworkMessageHandlers.cs | 1 + QuantumUNET/QNetworkScene.cs | 9 +++ QuantumUNET/QNetworkServer.cs | 60 +++++++++++++++++++ QuantumUNET/QNetworkServerSimple.cs | 13 ++++ QuantumUNET/QULocalConnectionToServer.cs | 1 + QuantumUNET/Transport/QChannelBuffer.cs | 14 +++++ QuantumUNET/Transport/QChannelPacket.cs | 3 + QuantumUNET/Transport/QNetBuffer.cs | 6 ++ QuantumUNET/Transport/QNetworkReader.cs | 12 ++++ QuantumUNET/Transport/QNetworkWriter.cs | 2 + 24 files changed, 316 insertions(+) diff --git a/QuantumUNET/Components/QNetworkAnimator.cs b/QuantumUNET/Components/QNetworkAnimator.cs index c72eaa4f..81098030 100644 --- a/QuantumUNET/Components/QNetworkAnimator.cs +++ b/QuantumUNET/Components/QNetworkAnimator.cs @@ -51,11 +51,13 @@ namespace QuantumUNET.Components { return; } + CheckSendRate(); if (!CheckAnimStateChanged(out var stateHash, out var normalizedTime)) { return; } + var animationMessage = new QAnimationMessage { netId = NetId, @@ -77,6 +79,7 @@ namespace QuantumUNET.Components { return; } + QNetworkServer.SendToReady(gameObject, 40, animationMessage); } } @@ -92,20 +95,24 @@ namespace QuantumUNET.Components { return false; } + m_TransitionHash = animatorTransitionInfo.fullPathHash; m_AnimationHash = 0; return true; } + var animatorStateInfo = m_Animator.GetCurrentAnimatorStateInfo(0); if (animatorStateInfo.fullPathHash == m_AnimationHash) { return false; } + if (m_AnimationHash != 0) { stateHash = animatorStateInfo.fullPathHash; normalizedTime = animatorStateInfo.normalizedTime; } + m_TransitionHash = 0; m_AnimationHash = animatorStateInfo.fullPathHash; return true; @@ -117,6 +124,7 @@ namespace QuantumUNET.Components { return; } + m_SendTimer = Time.time + GetNetworkSendInterval(); var parametersMessage = new QAnimationParametersMessage { @@ -146,10 +154,12 @@ namespace QuantumUNET.Components { return; } + if (msg.stateHash != 0) { m_Animator.Play(msg.stateHash, 0, msg.normalizedTime); } + ReadParameters(reader, false); } @@ -159,6 +169,7 @@ namespace QuantumUNET.Components { return; } + ReadParameters(reader, true); } @@ -200,6 +211,7 @@ namespace QuantumUNET.Components { return; } + switch (parameter.type) { case AnimatorControllerParameterType.Int: @@ -227,6 +239,7 @@ namespace QuantumUNET.Components { return false; } + if (m_Animator.IsInTransition(0)) { var animatorStateInfo = m_Animator.GetNextAnimatorStateInfo(0); @@ -239,6 +252,7 @@ namespace QuantumUNET.Components writer.Write(animatorStateInfo.fullPathHash); writer.Write(animatorStateInfo.normalizedTime); } + WriteParameters(writer, false); return true; } @@ -249,6 +263,7 @@ namespace QuantumUNET.Components { return; } + var stateNameHash = reader.ReadInt32(); var normalizedTime = reader.ReadSingle(); ReadParameters(reader, false); @@ -270,11 +285,13 @@ namespace QuantumUNET.Components { return; } + var readyConnection = QClientScene.readyConnection; if (readyConnection == null) { return; } + readyConnection.Send(42, animationTriggerMessage); } else @@ -283,6 +300,7 @@ namespace QuantumUNET.Components { return; } + QNetworkServer.SendToReady(gameObject, 42, animationTriggerMessage); } } @@ -295,6 +313,7 @@ namespace QuantumUNET.Components { return; } + var component = localObject.GetComponent(); var reader = new QNetworkReader(AnimationMessage.parameters); component?.HandleAnimMsg(AnimationMessage, reader); @@ -309,6 +328,7 @@ namespace QuantumUNET.Components { return; } + var component = localObject.GetComponent(); var reader = new QNetworkReader(ParametersMessage.parameters); component?.HandleAnimParamsMsg(ParametersMessage, reader); @@ -323,6 +343,7 @@ namespace QuantumUNET.Components { return; } + var component = localObject.GetComponent(); component?.HandleAnimTriggerMsg(TriggersMessage.hash); QNetworkServer.SendToReady(localObject, 42, TriggersMessage); diff --git a/QuantumUNET/Components/QNetworkIdentity.cs b/QuantumUNET/Components/QNetworkIdentity.cs index 0f1ca4ef..a36f015e 100644 --- a/QuantumUNET/Components/QNetworkIdentity.cs +++ b/QuantumUNET/Components/QNetworkIdentity.cs @@ -46,6 +46,7 @@ namespace QuantumUNET.Components { RootIdentity.RemoveSubIdentity(this); } + RootIdentity = newRoot; RootIdentity.AddSubIndentity(this); } @@ -74,6 +75,7 @@ namespace QuantumUNET.Components { QLog.Error("SetClientOwner m_ClientAuthorityOwner already set!"); } + ClientAuthorityOwner = conn; ClientAuthorityOwner.AddOwnedObject(this); } @@ -109,6 +111,7 @@ namespace QuantumUNET.Components { result = new ReadOnlyCollection(m_Observers); } + return result; } } @@ -192,6 +195,7 @@ namespace QuantumUNET.Components { HasAuthority = true; } + m_Observers = new List(); m_ObserverConnections = new HashSet(); CacheBehaviours(); @@ -204,6 +208,7 @@ namespace QuantumUNET.Components QLog.Warning($"Object has non-zero netId {NetId} for {gameObject}"); return; } + QNetworkServer.instance.SetLocalObjectOnServer(NetId, gameObject); foreach (var networkBehaviour in m_NetworkBehaviours) { @@ -216,11 +221,13 @@ namespace QuantumUNET.Components QLog.FatalError($"Exception in OnStartServer:{ex.Message} {ex.StackTrace}"); } } + if (QNetworkClient.active && QNetworkServer.localClientActive) { QClientScene.SetLocalObject(NetId, gameObject); OnStartClient(); } + if (HasAuthority) { OnStartAuthority(); @@ -234,6 +241,7 @@ namespace QuantumUNET.Components { IsClient = true; } + CacheBehaviours(); QLog.Debug($"OnStartClient {gameObject} GUID:{NetId} localPlayerAuthority:{LocalPlayerAuthority}"); foreach (var networkBehaviour in m_NetworkBehaviours) @@ -346,6 +354,7 @@ namespace QuantumUNET.Components break; } } + bool result; if (networkBehaviour == null) { @@ -360,6 +369,7 @@ namespace QuantumUNET.Components invokeComponent = networkBehaviour; result = true; } + return result; } @@ -470,6 +480,7 @@ namespace QuantumUNET.Components num |= 1U << dirtyChannel; } } + if (num != 0U) { var j = 0; @@ -494,6 +505,7 @@ namespace QuantumUNET.Components networkBehaviour.ClearAllDirtyBits(); flag = true; } + var maxPacketSize = QNetworkServer.maxPacketSize; if (s_UpdateWriter.Position - position > maxPacketSize) { @@ -502,12 +514,14 @@ namespace QuantumUNET.Components } } } + if (flag) { s_UpdateWriter.FinishMessage(); QNetworkServer.SendWriterToReady(gameObject, s_UpdateWriter, j); } } + j++; } } @@ -535,6 +549,7 @@ namespace QuantumUNET.Components { HasAuthority = true; } + foreach (var networkBehaviour in m_NetworkBehaviours) { networkBehaviour.OnStartLocalPlayer(); @@ -562,6 +577,7 @@ namespace QuantumUNET.Components networkBehaviour.OnNetworkDestroy(); num++; } + m_IsServer = false; } @@ -575,6 +591,7 @@ namespace QuantumUNET.Components var networkConnection = m_Observers[i]; networkConnection.RemoveFromVisList(this, true); } + m_Observers.Clear(); m_ObserverConnections.Clear(); } @@ -621,6 +638,7 @@ namespace QuantumUNET.Components { flag2 |= networkBehaviour.OnRebuildObservers(hashSet, initialize); } + if (!flag2) { if (initialize) @@ -666,6 +684,7 @@ namespace QuantumUNET.Components } } } + foreach (var networkConnection4 in hashSet2) { if (!hashSet.Contains(networkConnection4)) @@ -675,6 +694,7 @@ namespace QuantumUNET.Components flag = true; } } + if (initialize) { foreach (var connection in QNetworkServer.localConnections) @@ -685,6 +705,7 @@ namespace QuantumUNET.Components } } } + if (flag) { m_Observers = new List(hashSet); @@ -720,6 +741,7 @@ namespace QuantumUNET.Components QLog.Warning($"RemoveClientAuthority for {gameObject} has different owner."); return false; } + ClientAuthorityOwner.RemoveOwnedObject(this); ClientAuthorityOwner = null; ForceAuthority(true); @@ -754,6 +776,7 @@ namespace QuantumUNET.Components QLog.Warning($"AssignClientAuthority for {gameObject} owner cannot be null. Use RemoveClientAuthority() instead."); return false; } + ClientAuthorityOwner = conn; ClientAuthorityOwner.AddOwnedObject(this); diff --git a/QuantumUNET/Components/QNetworkManager.cs b/QuantumUNET/Components/QNetworkManager.cs index 627d2615..a5fff98c 100644 --- a/QuantumUNET/Components/QNetworkManager.cs +++ b/QuantumUNET/Components/QNetworkManager.cs @@ -57,6 +57,7 @@ namespace QuantumUNET.Components { m_ConnectionConfig = new ConnectionConfig(); } + return m_ConnectionConfig; } } @@ -69,6 +70,7 @@ namespace QuantumUNET.Components { m_GlobalConfig = new GlobalConfig(); } + return m_GlobalConfig; } } @@ -91,6 +93,7 @@ namespace QuantumUNET.Components } } } + return num; } } @@ -109,6 +112,7 @@ namespace QuantumUNET.Components Destroy(gameObject); return; } + QLog.Log("NetworkManager created singleton (DontDestroyOnLoad)"); singleton = this; if (Application.isPlaying) @@ -121,6 +125,7 @@ namespace QuantumUNET.Components QLog.Log("NetworkManager created singleton (ForScene)"); singleton = this; } + if (networkAddress != "") { s_Address = networkAddress; @@ -152,12 +157,14 @@ namespace QuantumUNET.Components { Application.runInBackground = true; } + QNetworkCRC.scriptCRCCheck = scriptCRCCheck; QNetworkServer.useWebSockets = useWebSockets; if (m_GlobalConfig != null) { NetworkTransport.Init(m_GlobalConfig); } + if (customConfig && m_ConnectionConfig != null && config == null) { m_ConnectionConfig.Channels.Clear(); @@ -165,12 +172,15 @@ namespace QuantumUNET.Components { m_ConnectionConfig.AddChannel(channel); } + QNetworkServer.Configure(m_ConnectionConfig, this.maxConnections); } + if (config != null) { QNetworkServer.Configure(config, maxConnections); } + if (serverBindToIP && !string.IsNullOrEmpty(serverBindAddress)) { if (!QNetworkServer.Listen(serverBindAddress, networkPort)) @@ -184,6 +194,7 @@ namespace QuantumUNET.Components QLog.FatalError("StartServer listen failed."); return false; } + RegisterServerMessages(); QLog.Log($"NetworkManager StartServer port:{networkPort}"); isNetworkActive = true; @@ -196,6 +207,7 @@ namespace QuantumUNET.Components { QNetworkServer.SpawnObjects(); } + return true; } @@ -210,6 +222,7 @@ namespace QuantumUNET.Components { QClientScene.RegisterPrefab(playerPrefab); } + foreach (var gameObject in spawnPrefabs) { if (gameObject != null) @@ -225,6 +238,7 @@ namespace QuantumUNET.Components { Application.runInBackground = true; } + if (externalClient != null) { client = externalClient; @@ -243,6 +257,7 @@ namespace QuantumUNET.Components ClientChangeScene(offlineScene, false); } } + s_Address = networkAddress; } @@ -253,11 +268,13 @@ namespace QuantumUNET.Components { Application.runInBackground = true; } + isNetworkActive = true; if (m_GlobalConfig != null) { NetworkTransport.Init(m_GlobalConfig); } + client = new QNetworkClient { hostPort = hostPort @@ -268,6 +285,7 @@ namespace QuantumUNET.Components { throw new ArgumentOutOfRangeException("Platform specific protocols are not supported on this platform"); } + client.Configure(config, 1); } else if (customConfig && m_ConnectionConfig != null) @@ -277,18 +295,22 @@ namespace QuantumUNET.Components { m_ConnectionConfig.AddChannel(channel); } + if (m_ConnectionConfig.UsePlatformSpecificProtocols && Application.platform != RuntimePlatform.PS4 && Application.platform != RuntimePlatform.PSP2) { throw new ArgumentOutOfRangeException("Platform specific protocols are not supported on this platform"); } + client.Configure(m_ConnectionConfig, maxConnections); } + RegisterClientMessages(client); if (string.IsNullOrEmpty(networkAddress)) { QLog.Error("Must set the Network Address field in the manager"); return null; } + client.Connect(networkAddress, networkPort); OnStartClient(client); s_Address = networkAddress; @@ -314,6 +336,7 @@ namespace QuantumUNET.Components { result = null; } + return result; } @@ -331,6 +354,7 @@ namespace QuantumUNET.Components { result = null; } + return result; } @@ -362,6 +386,7 @@ namespace QuantumUNET.Components { ServerChangeScene(offlineScene); } + CleanupNetworkIdentities(); } } @@ -377,11 +402,13 @@ namespace QuantumUNET.Components client.Shutdown(); client = null; } + QClientScene.DestroyAllClientObjects(); if (!string.IsNullOrEmpty(offlineScene)) { ClientChangeScene(offlineScene, false); } + CleanupNetworkIdentities(); } @@ -427,6 +454,7 @@ namespace QuantumUNET.Components return; } } + s_LoadingSceneAsync = SceneManager.LoadSceneAsync(newSceneName); networkSceneName = newSceneName; } @@ -447,11 +475,13 @@ namespace QuantumUNET.Components { QLog.Error("FinishLoadScene client is null"); } + if (QNetworkServer.active) { QNetworkServer.SpawnObjects(); OnServerSceneChanged(networkSceneName); } + if (IsClientConnected() && client != null) { RegisterClientMessages(client); @@ -499,6 +529,7 @@ namespace QuantumUNET.Components netMsg.Connection.SetChannelOption(i, ChannelOption.MaxPendingBuffers, m_MaxBufferedPackets); } } + if (!m_AllowFragmentation) { for (var j = 0; j < QNetworkServer.numChannels; j++) @@ -506,11 +537,13 @@ namespace QuantumUNET.Components netMsg.Connection.SetChannelOption(j, ChannelOption.AllowFragmentation, 0); } } + if (networkSceneName != "" && networkSceneName != offlineScene) { var msg = new QStringMessage(networkSceneName); netMsg.Connection.Send(39, msg); } + OnServerConnect(netMsg.Connection); } @@ -580,6 +613,7 @@ namespace QuantumUNET.Components { ClientChangeScene(offlineScene, false); } + OnClientDisconnect(netMsg.Connection); } @@ -626,6 +660,7 @@ namespace QuantumUNET.Components { QLog.Warning("Ready with no player object"); } + QNetworkServer.SetClientReady(conn); } @@ -714,10 +749,12 @@ namespace QuantumUNET.Components break; } } + if (!flag2) { flag = true; } + if (flag) { QClientScene.AddPlayer(0); diff --git a/QuantumUNET/Components/QNetworkManagerHUD.cs b/QuantumUNET/Components/QNetworkManagerHUD.cs index d5b932f0..3d46d504 100644 --- a/QuantumUNET/Components/QNetworkManagerHUD.cs +++ b/QuantumUNET/Components/QNetworkManagerHUD.cs @@ -27,12 +27,15 @@ namespace QuantumUNET.Components { Manager.StartHost(); } + yOffset += 20; } + if (GUI.Button(new Rect(xOffset, yOffset, 105f, 20f), "Connect")) { Manager.StartClient(); } + Manager.networkAddress = GUI.TextField(new Rect(xOffset + 100, yOffset, 95f, 20f), Manager.networkAddress); yOffset += 20; } @@ -56,15 +59,18 @@ namespace QuantumUNET.Components { text += " (using WebSockets)"; } + GUI.Label(new Rect(xOffset, yOffset, 300f, 20f), text); yOffset += 20; } + if (Manager.IsClientConnected()) { GUI.Label(new Rect(xOffset, yOffset, 300f, 20f), $"Connected to {Manager.networkAddress}, port {Manager.networkPort}"); yOffset += 20; } } + if (Manager.IsClientConnected() && !QClientScene.ready) { if (GUI.Button(new Rect(xOffset, yOffset, 200f, 20f), "Client Ready")) @@ -75,14 +81,17 @@ namespace QuantumUNET.Components QClientScene.AddPlayer(0); } } + yOffset += 20; } + if (QNetworkServer.active || Manager.IsClientConnected()) { if (GUI.Button(new Rect(xOffset, yOffset, 200f, 20f), "Stop")) { Manager.StopHost(); } + yOffset += 20; } } diff --git a/QuantumUNET/Components/QNetworkTransform.cs b/QuantumUNET/Components/QNetworkTransform.cs index 3e290080..a0f31e98 100644 --- a/QuantumUNET/Components/QNetworkTransform.cs +++ b/QuantumUNET/Components/QNetworkTransform.cs @@ -34,8 +34,10 @@ namespace QuantumUNET.Components writer.WritePackedUInt32(0U); return false; } + writer.WritePackedUInt32(1U); } + SerializeTransform(writer); return true; } @@ -51,6 +53,7 @@ namespace QuantumUNET.Components return; } } + DeserializeTransform(reader); } } @@ -71,6 +74,7 @@ namespace QuantumUNET.Components DeserializeRotation(reader); return; } + transform.position = reader.ReadVector3(); transform.rotation = DeserializeRotation(reader); } diff --git a/QuantumUNET/Components/QNetworkTransformChild.cs b/QuantumUNET/Components/QNetworkTransformChild.cs index 5c298d43..b2bf347e 100644 --- a/QuantumUNET/Components/QNetworkTransformChild.cs +++ b/QuantumUNET/Components/QNetworkTransformChild.cs @@ -63,8 +63,10 @@ namespace QuantumUNET.Components writer.WritePackedUInt32(0U); return false; } + writer.WritePackedUInt32(1U); } + SerializeModeTransform(writer); return true; } @@ -88,6 +90,7 @@ namespace QuantumUNET.Components return; } } + UnserializeModeTransform(reader, initialState); LastSyncTime = Time.time; } @@ -115,6 +118,7 @@ namespace QuantumUNET.Components { FixedUpdateServer(); } + if (IsClient) { FixedUpdateClient(); @@ -141,6 +145,7 @@ namespace QuantumUNET.Components return; } } + SetDirtyBit(1U); } } @@ -208,6 +213,7 @@ namespace QuantumUNET.Components num = Quaternion.Angle(m_Target.localRotation, m_PrevRotation); result = num > 1E-05f; } + return result; } diff --git a/QuantumUNET/Logging/QLog.cs b/QuantumUNET/Logging/QLog.cs index 73dc281c..2265ec86 100644 --- a/QuantumUNET/Logging/QLog.cs +++ b/QuantumUNET/Logging/QLog.cs @@ -24,6 +24,7 @@ { return; } + UnityEngine.Debug.Log($"DEBUG : {message}"); } @@ -33,6 +34,7 @@ { return; } + UnityEngine.Debug.Log($"LOG : {message}"); } @@ -42,6 +44,7 @@ { return; } + UnityEngine.Debug.LogWarning($"WARN : {message}"); } @@ -51,6 +54,7 @@ { return; } + UnityEngine.Debug.LogError($"ERROR : {message}"); } @@ -60,6 +64,7 @@ { return; } + UnityEngine.Debug.LogError($"FATAL : {message}"); } } diff --git a/QuantumUNET/Messages/QMsgType.cs b/QuantumUNET/Messages/QMsgType.cs index 40dbdbfc..bbe5ae91 100644 --- a/QuantumUNET/Messages/QMsgType.cs +++ b/QuantumUNET/Messages/QMsgType.cs @@ -16,8 +16,10 @@ { text = $"[{value}]"; } + result = text; } + return result; } diff --git a/QuantumUNET/QClientScene.cs b/QuantumUNET/QClientScene.cs index d777a7a2..eb57c89d 100644 --- a/QuantumUNET/QClientScene.cs +++ b/QuantumUNET/QClientScene.cs @@ -58,6 +58,7 @@ namespace QuantumUNET player = localPlayers[playerControllerId]; result = player.Gameobject != null; } + return result; } @@ -73,6 +74,7 @@ namespace QuantumUNET localPlayers.Add(new QPlayerController()); } } + var playerController = new QPlayerController { Gameobject = view.gameObject, @@ -106,10 +108,12 @@ namespace QuantumUNET { Debug.LogWarning($"ClientScene::AddPlayer: playerControllerId of {playerControllerId} is unusually high"); } + while (playerControllerId >= localPlayers.Count) { localPlayers.Add(new QPlayerController()); } + if (readyConn == null) { if (!ready) @@ -123,6 +127,7 @@ namespace QuantumUNET ready = true; readyConnection = readyConn; } + if (readyConnection.GetPlayerController(playerControllerId, out var playerController)) { if (playerController.IsValid && playerController.Gameobject != null) @@ -131,6 +136,7 @@ namespace QuantumUNET return false; } } + Debug.Log($"ClientScene::AddPlayer() for ID {playerControllerId} called with connection [{readyConnection}]"); var addPlayerMessage = new QAddPlayerMessage { @@ -143,9 +149,11 @@ namespace QuantumUNET addPlayerMessage.msgData = networkWriter.ToArray(); addPlayerMessage.msgSize = networkWriter.Position; } + readyConnection.Send(37, addPlayerMessage); result = true; } + return result; } @@ -170,6 +178,7 @@ namespace QuantumUNET Debug.LogError($"Failed to find player ID {playerControllerId}"); result = false; } + return result; } @@ -199,6 +208,7 @@ namespace QuantumUNET result = false; } } + return result; } @@ -261,6 +271,7 @@ namespace QuantumUNET { result = null; } + return result; } @@ -288,6 +299,7 @@ namespace QuantumUNET client.RegisterHandlerSafe(QMsgType.Animation, QNetworkAnimator.OnAnimationClientMessage); client.RegisterHandlerSafe(QMsgType.AnimationParameters, QNetworkAnimator.OnAnimationParametersClientMessage); } + client.RegisterHandlerSafe(QMsgType.Rpc, OnRPCMessage); client.RegisterHandlerSafe(QMsgType.SyncEvent, OnSyncEventMessage); client.RegisterHandlerSafe(QMsgType.AnimationTrigger, QNetworkAnimator.OnAnimationTriggerClientMessage); @@ -331,12 +343,14 @@ namespace QuantumUNET { uv.gameObject.SetActive(true); } + uv.transform.position = position; if (payload != null && payload.Length > 0) { var reader = new QNetworkReader(payload); uv.OnUpdateVars(reader, true); } + if (newGameObject != null) { newGameObject.SetActive(true); @@ -448,6 +462,7 @@ namespace QuantumUNET CheckForOwner(networkIdentity); } } + s_IsSpawnFinished = true; } } @@ -471,6 +486,7 @@ namespace QuantumUNET SpawnableObjects[networkIdentity.SceneId] = networkIdentity; } } + s_NetworkScene.RemoveLocalObject(s_ObjectDestroyMessage.NetId); networkIdentity.MarkForReset(); } @@ -594,6 +610,7 @@ namespace QuantumUNET { playerController.UnetView.SetNotLocalPlayer(); } + if (s_NetworkScene.GetNetworkIdentity(s_OwnerMessage.NetId, out var networkIdentity)) { networkIdentity.SetConnectionToServer(netMsg.Connection); @@ -627,6 +644,7 @@ namespace QuantumUNET Debug.LogError("Owner message received on a local client."); break; } + InternalAddPlayer(uv, pendingOwner.playerControllerId); s_PendingOwnerIds.RemoveAt(i); break; diff --git a/QuantumUNET/QLocalClient.cs b/QuantumUNET/QLocalClient.cs index 9eeb5b7c..f9fb0322 100644 --- a/QuantumUNET/QLocalClient.cs +++ b/QuantumUNET/QLocalClient.cs @@ -15,6 +15,7 @@ namespace QuantumUNET PostInternalMessage(33); m_Connected = false; } + m_AsyncConnect = ConnectState.Disconnected; m_LocalServer.RemoveLocalClient(m_Connection); } @@ -30,6 +31,7 @@ namespace QuantumUNET m_FreeMessages.Push(t); } } + m_LocalServer = QNetworkServer.instance; m_Connection = new QULocalConnectionToServer(m_LocalServer); SetHandlers(m_Connection); @@ -41,6 +43,7 @@ namespace QuantumUNET { PostInternalMessage(32); } + m_Connected = true; } @@ -57,6 +60,7 @@ namespace QuantumUNET QClientScene.SetLocalObject(unetView.NetId, localPlayer.Gameobject); unetView.SetConnectionToServer(m_Connection); } + QClientScene.InternalAddPlayer(unetView, localPlayer.PlayerControllerId); } @@ -92,6 +96,7 @@ namespace QuantumUNET { s_InternalMessage.Reader.Replace(msg.buffer); } + s_InternalMessage.Reader.ReadInt16(); s_InternalMessage.ChannelId = msg.channelId; s_InternalMessage.Connection = connection; @@ -100,12 +105,14 @@ namespace QuantumUNET m_FreeMessages.Push(msg); connection.lastMessageTime = Time.time; } + m_InternalMsgs = internalMsgs; m_InternalMsgs.Clear(); foreach (var msg in m_InternalMsgs2) { m_InternalMsgs.Add(msg); } + m_InternalMsgs2.Clear(); } } diff --git a/QuantumUNET/QNetworkBehaviour.cs b/QuantumUNET/QNetworkBehaviour.cs index 0e6c6770..10e383ae 100644 --- a/QuantumUNET/QNetworkBehaviour.cs +++ b/QuantumUNET/QNetworkBehaviour.cs @@ -37,6 +37,7 @@ namespace QuantumUNET QLog.FatalError($"Trying to get QNetworkIdentity of a null gameobject?"); return null; } + if (m_MyView == null) { m_MyView = GetComponent(); @@ -44,12 +45,14 @@ namespace QuantumUNET { QLog.FatalError($"There is no QNetworkIdentity on this object (name={name}). Please add one."); } + myView = m_MyView; } else { myView = m_MyView; } + return myView; } } @@ -94,6 +97,7 @@ namespace QuantumUNET QLog.Warning("ClientRpc call on un-spawned object"); return; } + writer.FinishMessage(); QNetworkServer.SendWriterToReady(gameObject, writer, channelId); } @@ -105,6 +109,7 @@ namespace QuantumUNET QLog.Warning("TargetRpc call on un-spawned object"); return; } + writer.FinishMessage(); conn.SendWriter(writer, channelId); } @@ -118,6 +123,7 @@ namespace QuantumUNET QLog.Error($"Tried to send event {eventName} on channel {channelId} but QSBNetworkServer isn't active."); return; } + writer.FinishMessage(); QNetworkServer.SendWriterToReady(gameObject, writer, channelId); } @@ -194,6 +200,7 @@ namespace QuantumUNET var invoker = s_CmdHandlerDelegates[cmdHash]; result = invoker.DebugString(); } + return result; } @@ -239,6 +246,7 @@ namespace QuantumUNET invokeFunction = invoker.invokeFunction; result = true; } + return result; } @@ -277,10 +285,12 @@ namespace QuantumUNET return false; } } + invoker.invokeFunction(this, reader); result = true; } } + return result; } @@ -307,10 +317,12 @@ namespace QuantumUNET return false; } } + invoker.invokeFunction(this, reader); result = true; } } + return result; } @@ -334,6 +346,7 @@ namespace QuantumUNET result = true; } } + return result; } @@ -361,6 +374,7 @@ namespace QuantumUNET result = true; } } + return result; } @@ -376,6 +390,7 @@ namespace QuantumUNET var invoker = s_CmdHandlerDelegates[cmdHash]; result = $"{invoker.invokeType}:{invoker.invokeFunction.GetMethodName()}"; } + return result; } @@ -395,8 +410,10 @@ namespace QuantumUNET { text = text.Substring(prefix.Length); } + result = text; } + return result; } @@ -430,11 +447,13 @@ namespace QuantumUNET } } } + NetworkInstanceId networkInstanceId2 = default; if (gameObjectField != null) { networkInstanceId2 = gameObjectField.GetComponent().NetId; } + if (networkInstanceId != networkInstanceId2) { QLog.Log( @@ -489,6 +508,7 @@ namespace QuantumUNET return GetNetworkChannel(); } } + return -1; } @@ -498,6 +518,7 @@ namespace QuantumUNET { writer.WritePackedUInt32(0U); } + return false; } diff --git a/QuantumUNET/QNetworkCRC.cs b/QuantumUNET/QNetworkCRC.cs index 967775a6..9f16afc3 100644 --- a/QuantumUNET/QNetworkCRC.cs +++ b/QuantumUNET/QNetworkCRC.cs @@ -14,6 +14,7 @@ namespace QuantumUNET { s_Singleton = new QNetworkCRC(); } + return s_Singleton; } } @@ -68,6 +69,7 @@ namespace QuantumUNET return false; } } + if (crcmessageEntry.channel >= numChannels) { Debug.LogError( @@ -76,8 +78,10 @@ namespace QuantumUNET return false; } } + result = true; } + return result; } @@ -87,6 +91,7 @@ namespace QuantumUNET { Debug.Log($"CRC Local Dump {text} : {scripts[text]}"); } + foreach (var crcmessageEntry in remoteScripts) { Debug.Log($"CRC Remote Dump {crcmessageEntry.name} : {crcmessageEntry.channel}"); diff --git a/QuantumUNET/QNetworkClient.cs b/QuantumUNET/QNetworkClient.cs index 76d8cea7..7dd1f3da 100644 --- a/QuantumUNET/QNetworkClient.cs +++ b/QuantumUNET/QNetworkClient.cs @@ -73,10 +73,12 @@ namespace QuantumUNET { throw new ArgumentException("Port must not be a negative number."); } + if (value > 65535) { throw new ArgumentException("Port must not be greater than 65535."); } + m_HostPort = value; } } @@ -142,6 +144,7 @@ namespace QuantumUNET connectionConfig.UsePlatformSpecificProtocols = false; hostTopology = new HostTopology(connectionConfig, 8); } + hostId = NetworkTransport.AddHost(hostTopology, m_HostPort); } @@ -218,6 +221,7 @@ namespace QuantumUNET QLog.Error("NetworkClient Send with no connection"); result = false; } + return result; } @@ -241,6 +245,7 @@ namespace QuantumUNET QLog.Error("NetworkClient SendWriter with no connection"); result = false; } + return result; } @@ -264,6 +269,7 @@ namespace QuantumUNET QLog.Error("NetworkClient SendBytes with no connection"); result = false; } + return result; } @@ -287,6 +293,7 @@ namespace QuantumUNET QLog.Error("NetworkClient SendUnreliable with no connection"); result = false; } + return result; } @@ -310,6 +317,7 @@ namespace QuantumUNET QLog.Error("NetworkClient SendByChannel with no connection"); result = false; } + return result; } @@ -333,6 +341,7 @@ namespace QuantumUNET NetworkTransport.RemoveHost(hostId); hostId = -1; } + RemoveClient(this); if (allClients.Count == 0) { @@ -359,6 +368,7 @@ namespace QuantumUNET m_AsyncConnect = ConnectState.Disconnected; return; } + if (m_Connection != null) { if ((int)Time.time != m_StatResetTime) @@ -367,6 +377,7 @@ namespace QuantumUNET m_StatResetTime = (int)Time.time; } } + var num = 0; byte b; for (; ; ) @@ -376,6 +387,7 @@ namespace QuantumUNET { m_Connection.LastError = (NetworkError)b; } + switch (networkEventType) { case NetworkEventType.DataEvent: @@ -383,6 +395,7 @@ namespace QuantumUNET { goto Block_11; } + m_MsgReader.SeekZero(); m_Connection.TransportReceive(m_MsgBuffer, numBytes, channelId); break; @@ -393,6 +406,7 @@ namespace QuantumUNET { goto Block_10; } + m_AsyncConnect = ConnectState.Connected; m_Connection.InvokeHandlerNoData(32); break; @@ -407,6 +421,7 @@ namespace QuantumUNET GenerateDisconnectError(b); } } + QClientScene.HandleClientDisconnect(m_Connection); m_Connection?.InvokeHandlerNoData(33); break; @@ -418,19 +433,23 @@ namespace QuantumUNET QLog.Error($"Unknown network message type received: {networkEventType}"); break; } + if (++num >= 500) { goto Block_17; } + if (hostId == -1) { goto Block_19; } + if (networkEventType == NetworkEventType.Nothing) { goto IL_2C6; } } + Block_10: GenerateConnectError(b); return; @@ -559,6 +578,7 @@ namespace QuantumUNET } } } + return dictionary; } @@ -587,6 +607,7 @@ namespace QuantumUNET { allClients[0].Shutdown(); } + allClients = new List(); active = false; QClientScene.Shutdown(); @@ -598,6 +619,7 @@ namespace QuantumUNET { NetworkTransport.Init(); } + active = state; } diff --git a/QuantumUNET/QNetworkConnection.cs b/QuantumUNET/QNetworkConnection.cs index 9eafb43a..3d0c915d 100644 --- a/QuantumUNET/QNetworkConnection.cs +++ b/QuantumUNET/QNetworkConnection.cs @@ -38,6 +38,7 @@ namespace QuantumUNET { throw new ArgumentOutOfRangeException("Platform specific protocols are not supported on this platform"); } + m_Channels = new QChannelBuffer[channelCount]; for (var i = 0; i < channelCount; i++) { @@ -47,6 +48,7 @@ namespace QuantumUNET { bufferSize = hostTopology.DefaultConfig.FragmentSize * 128; } + m_Channels[i] = new QChannelBuffer(this, bufferSize, (byte)i, IsReliableQoS(channelQOS.QOS), IsSequencedQoS(channelQOS.QOS)); } } @@ -71,6 +73,7 @@ namespace QuantumUNET channel.Dispose(); } } + m_Channels = null; if (ClientOwnedObjects != null) { @@ -83,6 +86,7 @@ namespace QuantumUNET } } } + ClientOwnedObjects = null; m_Disposed = true; } @@ -139,6 +143,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -155,6 +160,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -183,6 +189,7 @@ namespace QuantumUNET { PlayerControllers.Add(new QPlayerController()); } + PlayerControllers[player.PlayerControllerId] = player; } @@ -196,6 +203,7 @@ namespace QuantumUNET return; } } + QLog.Error($"RemovePlayer player at playerControllerId {playerControllerId} not found"); } @@ -220,6 +228,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -275,6 +284,7 @@ namespace QuantumUNET break; } } + QLog.Log( $"ConnectionSend con:{connectionId} bytes:{num} msgId:{num2} {stringBuilder}"); } @@ -297,6 +307,7 @@ namespace QuantumUNET { result = true; } + return result; } @@ -323,11 +334,13 @@ namespace QuantumUNET { networkMessageDelegate = m_MessageHandlersDict[num2]; } + if (networkMessageDelegate == null) { QLog.Error($"Unknown message ID {num2} connId:{connectionId}"); break; } + m_NetMsg.MsgType = num2; m_NetMsg.Reader = reader2; m_NetMsg.Connection = this; @@ -387,6 +400,7 @@ namespace QuantumUNET { networkIdentity.RemoveObserverInternal(this); } + VisList.Clear(); } @@ -400,6 +414,7 @@ namespace QuantumUNET { ClientOwnedObjects = new HashSet(); } + ClientOwnedObjects.Add(obj.NetId); } diff --git a/QuantumUNET/QNetworkMessageHandlers.cs b/QuantumUNET/QNetworkMessageHandlers.cs index d341f326..57da6c75 100644 --- a/QuantumUNET/QNetworkMessageHandlers.cs +++ b/QuantumUNET/QNetworkMessageHandlers.cs @@ -41,6 +41,7 @@ namespace QuantumUNET QLog.Log($"RegisterHandler replacing {msgType}"); _msgHandlers.Remove(msgType); } + QLog.Debug($"RegisterHandler id:{msgType} handler:{handler.GetMethodName()}"); _msgHandlers.Add(msgType, handler); } diff --git a/QuantumUNET/QNetworkScene.cs b/QuantumUNET/QNetworkScene.cs index 62cd264f..16ff0fe4 100644 --- a/QuantumUNET/QNetworkScene.cs +++ b/QuantumUNET/QNetworkScene.cs @@ -34,11 +34,13 @@ namespace QuantumUNET { networkIdentity = localObjects[netId]; } + if (networkIdentity == null) { networkIdentity = obj.GetComponent(); localObjects[netId] = networkIdentity; } + networkIdentity.UpdateClientServer(isClient, isServer); } } @@ -53,6 +55,7 @@ namespace QuantumUNET return networkIdentity.gameObject; } } + return null; } @@ -69,6 +72,7 @@ namespace QuantumUNET uv = null; result = false; } + return result; } @@ -87,6 +91,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -143,6 +148,7 @@ namespace QuantumUNET prefab = null; result = false; } + return result; } @@ -221,6 +227,7 @@ namespace QuantumUNET handler = null; result = false; } + return result; } @@ -237,6 +244,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -261,6 +269,7 @@ namespace QuantumUNET } } } + ClearLocalObjects(); } diff --git a/QuantumUNET/QNetworkServer.cs b/QuantumUNET/QNetworkServer.cs index 99e70020..77fb3022 100644 --- a/QuantumUNET/QNetworkServer.cs +++ b/QuantumUNET/QNetworkServer.cs @@ -60,6 +60,7 @@ namespace QuantumUNET } } } + return s_Instance; } } @@ -101,8 +102,10 @@ namespace QuantumUNET { s_Instance.m_SimpleServerSimple.Stop(); } + s_Instance = null; } + dontListen = false; active = false; } @@ -160,6 +163,7 @@ namespace QuantumUNET { return false; } + maxPacketSize = hostTopology.DefaultConfig.PacketSize; active = true; RegisterMessageHandlers(); @@ -195,6 +199,7 @@ namespace QuantumUNET m_LocalConnection.InvokeHandlerNoData(32); result = 0; } + return result; } @@ -208,12 +213,14 @@ namespace QuantumUNET break; } } + if (m_LocalConnection != null) { m_LocalConnection.Disconnect(); m_LocalConnection.Dispose(); m_LocalConnection = null; } + m_LocalClientActive = false; m_SimpleServerSimple.RemoveConnectionAtIndex(0); } @@ -252,6 +259,7 @@ namespace QuantumUNET flag &= networkConnection.Send(msgType, msg); } } + return flag; } @@ -273,8 +281,10 @@ namespace QuantumUNET var networkConnection = component.Observers[i]; flag &= networkConnection.Send(msgType, msg); } + result = flag; } + return result; } @@ -313,9 +323,11 @@ namespace QuantumUNET flag &= networkConnection2.Send(msgType, msg); } } + result = flag; } } + return result; } @@ -326,6 +338,7 @@ namespace QuantumUNET { throw new UnityException("NetworkWriter used buffer is too big!"); } + SendBytesToReady(contextObj, arraySegment.Array, arraySegment.Count, channelId); } @@ -344,6 +357,7 @@ namespace QuantumUNET } } } + if (!flag) { QLog.Error("SendBytesToReady failed"); @@ -367,6 +381,7 @@ namespace QuantumUNET } } } + if (!flag2) { QLog.Error($"SendBytesToReady failed for {contextObj}"); @@ -408,6 +423,7 @@ namespace QuantumUNET flag &= networkConnection.SendUnreliable(msgType, msg); } } + return flag; } @@ -440,8 +456,10 @@ namespace QuantumUNET flag &= networkConnection2.SendUnreliable(msgType, msg); } } + result = flag; } + return result; } @@ -456,6 +474,7 @@ namespace QuantumUNET flag &= networkConnection.SendByChannel(msgType, msg, channelId); } } + return flag; } @@ -488,8 +507,10 @@ namespace QuantumUNET flag &= networkConnection2.SendByChannel(msgType, msg, channelId); } } + result = flag; } + return result; } @@ -504,6 +525,7 @@ namespace QuantumUNET m_LocalConnection.Dispose(); m_LocalConnection = null; } + m_LocalClientActive = false; } @@ -524,6 +546,7 @@ namespace QuantumUNET { } } + if (m_RemoveListCount++ % 100 == 0) { CheckForNullObjects(); @@ -540,12 +563,14 @@ namespace QuantumUNET m_RemoveList.Add(networkInstanceId); } } + if (m_RemoveList.Count > 0) { foreach (var key in m_RemoveList) { objects.Remove(key); } + m_RemoveList.Clear(); } } @@ -557,6 +582,7 @@ namespace QuantumUNET { m_SimpleServerSimple.UpdateConnections(); } + UpdateServerObjects(); } @@ -578,6 +604,7 @@ namespace QuantumUNET QLog.Warning("Player not destroyed when connection disconnected."); } } + QLog.Log($"Server lost client:{conn.connectionId}"); conn.RemoveObservers(); conn.Dispose(); @@ -676,6 +703,7 @@ namespace QuantumUNET } } } + QLog.Error($"Failed to send message to player object '{player.name}, not found in connection list"); } @@ -690,6 +718,7 @@ namespace QuantumUNET return; } } + QLog.Error($"Failed to send message to connection ID '{connectionId}, not found in connection list"); } @@ -718,6 +747,7 @@ namespace QuantumUNET { x = playerController.Gameobject; } + if (x != null) { QLog.Log( @@ -743,11 +773,13 @@ namespace QuantumUNET { networkIdentity.SetClientOwner(conn); } + result = true; } } } } + return result; } @@ -770,8 +802,10 @@ namespace QuantumUNET { QLog.Warning($"AddPlayer: playerControllerId of {playerControllerId} is unusually high"); } + result = true; } + return result; } @@ -786,6 +820,7 @@ namespace QuantumUNET { uv.OnStartServer(true); } + uv.RebuildObservers(true); SendSpawnMessage(uv, null); ulocalConnectionToClient.LocalClient.AddLocalPlayer(newPlayerController); @@ -798,6 +833,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -807,6 +843,7 @@ namespace QuantumUNET { Spawn(playerGameObject); } + conn.Send(4, new QOwnerMessage { NetId = uv.NetId, @@ -827,6 +864,7 @@ namespace QuantumUNET { result = true; } + return result; } @@ -845,6 +883,7 @@ namespace QuantumUNET { QLog.Warning("Ready with no player object"); } + conn.isReady = true; if (conn is QULocalConnectionToClient) { @@ -858,6 +897,7 @@ namespace QuantumUNET { networkIdentity.AddObserver(conn); } + if (!networkIdentity.IsClient) { QLog.Log("LocalClient.SetSpawnObject calling OnStartClient"); @@ -891,6 +931,7 @@ namespace QuantumUNET } } } + objectSpawnFinishedMessage.State = 1U; conn.Send(12, objectSpawnFinishedMessage); } @@ -988,6 +1029,7 @@ namespace QuantumUNET break; } } + if (!flag) { if (component.ClientAuthorityOwner != netMsg.Connection) @@ -996,6 +1038,7 @@ namespace QuantumUNET return; } } + QLog.Log($"OnCommandMessage for netId={networkInstanceId} conn={netMsg.Connection}"); component.HandleCommand(cmdHash, netMsg.Reader); } @@ -1040,6 +1083,7 @@ namespace QuantumUNET { objectSpawnMessage.Payload = networkWriter.ToArray(); } + if (conn != null) { conn.Send(3, objectSpawnMessage); @@ -1063,6 +1107,7 @@ namespace QuantumUNET { objectSpawnSceneMessage.Payload = networkWriter2.ToArray(); } + if (conn != null) { conn.Send(10, objectSpawnSceneMessage); @@ -1091,6 +1136,7 @@ namespace QuantumUNET DestroyObject(gameObject); } } + foreach (var playerController in conn.PlayerControllers) { if (playerController.IsValid) @@ -1099,9 +1145,11 @@ namespace QuantumUNET { DestroyObject(playerController.UnetView, true); } + playerController.Gameobject = null; } } + conn.PlayerControllers.Clear(); } } @@ -1152,10 +1200,12 @@ namespace QuantumUNET uv.OnNetworkDestroy(); QClientScene.SetLocalObject(objectDestroyMessage.NetId, null); } + if (destroyServerObject) { UnityEngine.Object.Destroy(uv.gameObject); } + uv.MarkForReset(); } @@ -1183,6 +1233,7 @@ namespace QuantumUNET { result = true; } + return result; } @@ -1204,6 +1255,7 @@ namespace QuantumUNET { result = SpawnWithClientAuthority(obj, component.ConnectionToClient); } + return result; } @@ -1221,6 +1273,7 @@ namespace QuantumUNET var component = obj.GetComponent(); result = !(component == null) && component.IsServer && component.AssignClientAuthority(conn); } + return result; } @@ -1239,6 +1292,7 @@ namespace QuantumUNET { networkIdentity.SetDynamicAssetId(assetId); } + instance.SpawnObject(obj); } } @@ -1262,6 +1316,7 @@ namespace QuantumUNET { result = false; } + return result; } @@ -1281,6 +1336,7 @@ namespace QuantumUNET QLog.Error($"Local invoke: Failed to find local connection to invoke handler on [connectionId={conn.connectionId}] for MsgId:{msgType}"); result = false; } + return result; } @@ -1308,6 +1364,7 @@ namespace QuantumUNET networkIdentity.gameObject.SetActive(true); } } + foreach (var networkIdentity2 in objectsOfTypeAll) { if (ValidateSceneObject(networkIdentity2)) @@ -1316,8 +1373,10 @@ namespace QuantumUNET networkIdentity2.ForceAuthority(true); } } + result = true; } + return result; } @@ -1337,6 +1396,7 @@ namespace QuantumUNET channel = (byte)QNetworkCRC.singleton.scripts[text] }); } + crcmessage.scripts = list.ToArray(); targetConnection.Send(14, crcmessage); } diff --git a/QuantumUNET/QNetworkServerSimple.cs b/QuantumUNET/QNetworkServerSimple.cs index e9d08518..b72be52e 100644 --- a/QuantumUNET/QNetworkServerSimple.cs +++ b/QuantumUNET/QNetworkServerSimple.cs @@ -49,6 +49,7 @@ namespace QuantumUNET connectionConfig.AddChannel(QosType.Unreliable); hostTopology = new HostTopology(connectionConfig, 8); } + Debug.Log("NetworkServerSimple initialize."); } } @@ -82,6 +83,7 @@ namespace QuantumUNET Debug.Log($"NetworkServerSimple listen: {ipAddress}:{listenPort}"); result = true; } + return result; } @@ -105,6 +107,7 @@ namespace QuantumUNET Debug.Log($"NetworkServerSimple listen {listenPort}"); result = true; } + return result; } @@ -154,15 +157,18 @@ namespace QuantumUNET { Debug.Log($"NetGroup event:{networkEventType}"); } + if (networkEventType == NetworkEventType.ConnectEvent) { Debug.Log("NetGroup server connected"); } + if (networkEventType == NetworkEventType.DisconnectEvent) { Debug.Log("NetGroup server disconnected"); } } + do { networkEventType = NetworkTransport.ReceiveFromHost(serverHostId, out var connectionId, out var channelId, messageBuffer, messageBuffer.Length, out var receivedSize, out var b); @@ -170,6 +176,7 @@ namespace QuantumUNET { Debug.Log($"Server event: host={serverHostId} event={networkEventType} error={b}"); } + switch (networkEventType) { case NetworkEventType.DataEvent: @@ -208,6 +215,7 @@ namespace QuantumUNET { result = m_Connections[connectionId]; } + return result; } @@ -217,6 +225,7 @@ namespace QuantumUNET { m_Connections.Add(null); } + bool result; if (m_Connections[conn.connectionId] != null) { @@ -228,6 +237,7 @@ namespace QuantumUNET conn.SetHandlers(m_MessageHandlers); result = true; } + return result; } @@ -243,6 +253,7 @@ namespace QuantumUNET m_Connections[connectionId] = null; result = true; } + return result; } @@ -264,6 +275,7 @@ namespace QuantumUNET { m_Connections.Add(null); } + m_Connections[connectionId] = networkConnection; OnConnected(networkConnection); } @@ -287,6 +299,7 @@ namespace QuantumUNET return; } } + networkConnection.Disconnect(); m_Connections[connectionId] = null; Debug.Log($"Server lost client:{connectionId}"); diff --git a/QuantumUNET/QULocalConnectionToServer.cs b/QuantumUNET/QULocalConnectionToServer.cs index 80e7830e..d845a1e8 100644 --- a/QuantumUNET/QULocalConnectionToServer.cs +++ b/QuantumUNET/QULocalConnectionToServer.cs @@ -33,6 +33,7 @@ namespace QuantumUNET { result = m_LocalServer.InvokeBytes(this, bytes, numBytes, channelId); } + return result; } diff --git a/QuantumUNET/Transport/QChannelBuffer.cs b/QuantumUNET/Transport/QChannelBuffer.cs index 7effb89a..6b69327b 100644 --- a/QuantumUNET/Transport/QChannelBuffer.cs +++ b/QuantumUNET/Transport/QChannelBuffer.cs @@ -80,9 +80,11 @@ namespace QuantumUNET.Transport _freePackets.Add(item); } } + _pendingPackets.Clear(); } } + _disposed = true; } @@ -141,6 +143,7 @@ namespace QuantumUNET.Transport _maxPendingPacketCount = value; result = true; } + return result; } @@ -151,6 +154,7 @@ namespace QuantumUNET.Transport SendInternalBuffer(); _lastFlushTime = Time.realtimeSinceStartup; } + if (Time.realtimeSinceStartup - _lastBufferedMessageCountTimer > 1f) { LastBufferedPerSecond = NumBufferedPerSecond; @@ -184,6 +188,7 @@ namespace QuantumUNET.Transport _fragmentBuffer.SeekZero(); _readingFragment = true; } + var array = reader.ReadBytesAndSize(); _fragmentBuffer.WriteBytes(array, (ushort)array.Length); result = false; @@ -193,6 +198,7 @@ namespace QuantumUNET.Transport _readingFragment = false; result = true; } + return result; } @@ -212,6 +218,7 @@ namespace QuantumUNET.Transport num += num2; bytesToSend -= num2; } + _fragmentWriter.StartMessage(17); _fragmentWriter.Write(1); _fragmentWriter.FinishMessage(); @@ -255,6 +262,7 @@ namespace QuantumUNET.Transport { QueuePacket(); } + _currentPacket.Write(bytes, bytesToSend); result = true; } @@ -264,6 +272,7 @@ namespace QuantumUNET.Transport { Debug.LogError($"ChannelBuffer buffer limit of {_pendingPackets.Count} packets reached."); } + _isBroken = true; result = false; } @@ -290,6 +299,7 @@ namespace QuantumUNET.Transport _currentPacket.Write(bytes, bytesToSend); result = MaxDelay != 0f || SendInternalBuffer(); } + return result; } @@ -314,6 +324,7 @@ namespace QuantumUNET.Transport channelPacket.Reset(); result = channelPacket; } + return result; } @@ -338,6 +349,7 @@ namespace QuantumUNET.Transport _pendingPackets.Enqueue(channelPacket); break; } + _pendingPacketCount--; FreePacket(channelPacket); if (_isBroken && _pendingPackets.Count < _maxPendingPacketCount / 2) @@ -346,12 +358,14 @@ namespace QuantumUNET.Transport _isBroken = false; } } + result = true; } else { result = _currentPacket.SendToTransport(_connection, _channelId); } + return result; } } diff --git a/QuantumUNET/Transport/QChannelPacket.cs b/QuantumUNET/Transport/QChannelPacket.cs index 26d2d235..292bff02 100644 --- a/QuantumUNET/Transport/QChannelPacket.cs +++ b/QuantumUNET/Transport/QChannelPacket.cs @@ -40,15 +40,18 @@ namespace QuantumUNET.Transport result = false; } } + if (b != 0) { if (m_IsReliable && b == 4) { return false; } + Debug.LogError($"Send Error: {(NetworkError)b} channel:{channelId} bytesToSend:{m_Position}"); result = false; } + m_Position = 0; return result; } diff --git a/QuantumUNET/Transport/QNetBuffer.cs b/QuantumUNET/Transport/QNetBuffer.cs index b5294abc..309286a3 100644 --- a/QuantumUNET/Transport/QNetBuffer.cs +++ b/QuantumUNET/Transport/QNetBuffer.cs @@ -18,6 +18,7 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"NetworkReader:ReadByte out of range:{ToString()}"); } + return m_Buffer[(int)(UIntPtr)Position++]; } @@ -27,12 +28,14 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"NetworkReader:ReadBytes out of range: ({count}) {ToString()}"); } + ushort num = 0; while (num < count) { buffer[num] = m_Buffer[(int)(UIntPtr)(Position + num)]; num += 1; } + Position += count; } @@ -92,6 +95,7 @@ namespace QuantumUNET.Transport m_Buffer[targetOffset + i] = buffer[i]; } } + if (num > Position) { Position = num; @@ -112,6 +116,7 @@ namespace QuantumUNET.Transport m_Buffer[(int)checked(unchecked(Position + (ulong)i))] = buffer[i]; } } + Position += count; } @@ -128,6 +133,7 @@ namespace QuantumUNET.Transport Debug.LogWarning($"NetworkBuffer size is {num} bytes!"); } } + var array = new byte[num]; m_Buffer.CopyTo(array, 0); m_Buffer = array; diff --git a/QuantumUNET/Transport/QNetworkReader.cs b/QuantumUNET/Transport/QNetworkReader.cs index d68720e1..bc35cf48 100644 --- a/QuantumUNET/Transport/QNetworkReader.cs +++ b/QuantumUNET/Transport/QNetworkReader.cs @@ -78,11 +78,13 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"ReadPackedUInt32() failure: {b}"); } + result = (uint)(b2 + (b3 << 8) + (b4 << 16) + (b5 << 24)); } } } } + return result; } @@ -150,6 +152,7 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"ReadPackedUInt64() failure: {b}"); } + result = b2 + ((ulong)b3 << 8) + ((ulong)b4 << 16) + ((ulong)b5 << 24) + ((ulong)b6 << 32) + ((ulong)b7 << 40) + ((ulong)b8 << 48) + ((ulong)b9 << 56); } } @@ -159,6 +162,7 @@ namespace QuantumUNET.Transport } } } + return result; } @@ -275,14 +279,17 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"ReadString() too long: {num}"); } + while (num > s_StringReaderBuffer.Length) { s_StringReaderBuffer = new byte[s_StringReaderBuffer.Length * 2]; } + m_buf.ReadBytes(s_StringReaderBuffer, num); var chars = s_Encoding.GetChars(s_StringReaderBuffer, 0, num); result = new string(chars); } + return result; } @@ -300,6 +307,7 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"NetworkReader ReadBytes {count}"); } + var array = new byte[count]; m_buf.ReadBytes(array, (uint)count); return array; @@ -395,6 +403,7 @@ namespace QuantumUNET.Transport result = gameObject.transform; } } + return result; } @@ -415,8 +424,10 @@ namespace QuantumUNET.Transport { Debug.Log($"ReadGameObject netId:{networkInstanceId}go: null"); } + result = gameObject; } + return result; } @@ -443,6 +454,7 @@ namespace QuantumUNET.Transport result = gameObject.GetComponent(); } } + return result; } diff --git a/QuantumUNET/Transport/QNetworkWriter.cs b/QuantumUNET/Transport/QNetworkWriter.cs index 65475f3a..875e6421 100644 --- a/QuantumUNET/Transport/QNetworkWriter.cs +++ b/QuantumUNET/Transport/QNetworkWriter.cs @@ -200,6 +200,7 @@ namespace QuantumUNET.Transport { throw new IndexOutOfRangeException($"Serialize(string) too long: {value.Length}"); } + Write((ushort)byteCount); var bytes = s_Encoding.GetBytes(value, 0, value.Length, s_StringWriteBuffer, 0); m_Buffer.WriteBytes(s_StringWriteBuffer, (ushort)bytes); @@ -213,6 +214,7 @@ namespace QuantumUNET.Transport m_Buffer.WriteByte(1); return; } + m_Buffer.WriteByte(0); } From e903e3700a82e64a92e4623d6b3ab663e8e4d3e1 Mon Sep 17 00:00:00 2001 From: Mister_Nebula <41904486+misternebula@users.noreply.github.com> Date: Fri, 18 Jun 2021 22:40:38 +0100 Subject: [PATCH 3/3] fix in weaver --- QNetWeaver/Helpers.cs | 15 +++ QNetWeaver/MessageClassProcessor.cs | 9 ++ QNetWeaver/MonoBehaviourProcessor.cs | 4 + QNetWeaver/NetworkBehaviourProcessor.cs | 117 ++++++++++++++++++++++++ QNetWeaver/Program.cs | 3 + QNetWeaver/SyncListStructProcessor.cs | 11 +++ QNetWeaver/Weaver.cs | 89 ++++++++++++++++++ 7 files changed, 248 insertions(+) diff --git a/QNetWeaver/Helpers.cs b/QNetWeaver/Helpers.cs index 1fb1962e..aed3161d 100644 --- a/QNetWeaver/Helpers.cs +++ b/QNetWeaver/Helpers.cs @@ -37,6 +37,7 @@ namespace QNetWeaver Console.WriteLine("No symbols for " + inputFile); result = null; } + return result; } @@ -48,6 +49,7 @@ namespace QNetWeaver { return false; } + foreach (var typeReference in ResolveInheritanceHierarchy(typeRef)) { if (typeReference.IsGenericInstance) @@ -63,6 +65,7 @@ namespace QNetWeaver catch { } + return false; } @@ -75,6 +78,7 @@ namespace QNetWeaver yield return Weaver.objectType; yield break; } + while (type != null && type.FullName != Weaver.objectType.FullName) { yield return type; @@ -85,6 +89,7 @@ namespace QNetWeaver { break; } + type = typeDefinition.BaseType; } catch @@ -92,6 +97,7 @@ namespace QNetWeaver break; } } + yield return Weaver.objectType; yield break; } @@ -122,6 +128,7 @@ namespace QNetWeaver { result = type.Name; } + return result; } @@ -132,6 +139,7 @@ namespace QNetWeaver { assemblyResolver = new DefaultAssemblyResolver(); } + var addSearchDirectoryHelper = new Helpers.AddSearchDirectoryHelper(assemblyResolver); addSearchDirectoryHelper.AddSearchDirectory(Path.GetDirectoryName(assemblyPath)); addSearchDirectoryHelper.AddSearchDirectory(UnityEngineDLLDirectoryName()); @@ -144,6 +152,7 @@ namespace QNetWeaver addSearchDirectoryHelper.AddSearchDirectory(directory); } } + readerParameters.AssemblyResolver = assemblyResolver; readerParameters.SymbolReaderProvider = GetSymbolReaderProvider(assemblyPath); return readerParameters; @@ -160,6 +169,7 @@ namespace QNetWeaver { writerParameters.SymbolWriterProvider = new MdbWriterProvider(); } + return writerParameters; } @@ -169,11 +179,13 @@ namespace QNetWeaver { throw new ArgumentException(); } + var genericInstanceType = new GenericInstanceType(self); foreach (var item in arguments) { genericInstanceType.GenericArguments.Add(item); } + return genericInstanceType; } @@ -189,10 +201,12 @@ namespace QNetWeaver { methodReference.Parameters.Add(new ParameterDefinition(parameterDefinition.ParameterType)); } + foreach (var genericParameter in self.GenericParameters) { methodReference.GenericParameters.Add(new GenericParameter(genericParameter.Name, methodReference)); } + return methodReference; } @@ -208,6 +222,7 @@ namespace QNetWeaver { throw new Exception("Assembly resolver doesn't implement AddSearchDirectory method."); } + _addSearchDirectory = (Helpers.AddSearchDirectoryHelper.AddSearchDirectoryDelegate)Delegate.CreateDelegate(typeof(Helpers.AddSearchDirectoryHelper.AddSearchDirectoryDelegate), assemblyResolver, method); } diff --git a/QNetWeaver/MessageClassProcessor.cs b/QNetWeaver/MessageClassProcessor.cs index 1d11474c..9e4ffe7e 100644 --- a/QNetWeaver/MessageClassProcessor.cs +++ b/QNetWeaver/MessageClassProcessor.cs @@ -34,6 +34,7 @@ namespace QNetWeaver return; } } + if (m_td.Fields.Count != 0) { foreach (var fieldDefinition in m_td.Fields) @@ -52,6 +53,7 @@ namespace QNetWeaver return; } } + var methodDefinition2 = new MethodDefinition("Serialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType); methodDefinition2.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType))); var ilprocessor = methodDefinition2.Body.GetILProcessor(); @@ -74,6 +76,7 @@ namespace QNetWeaver })); return; } + if (fieldDefinition2.FieldType.Resolve().IsInterface) { Weaver.fail = true; @@ -89,6 +92,7 @@ namespace QNetWeaver })); return; } + var writeFunc = Weaver.GetWriteFunc(fieldDefinition2.FieldType); if (writeFunc == null) { @@ -105,12 +109,14 @@ namespace QNetWeaver })); return; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldfld, fieldDefinition2)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc)); } } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_td.Methods.Add(methodDefinition2); } @@ -126,6 +132,7 @@ namespace QNetWeaver return; } } + if (m_td.Fields.Count != 0) { var methodDefinition2 = new MethodDefinition("Deserialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType); @@ -149,12 +156,14 @@ namespace QNetWeaver })); return; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc)); ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldDefinition)); } } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_td.Methods.Add(methodDefinition2); } diff --git a/QNetWeaver/MonoBehaviourProcessor.cs b/QNetWeaver/MonoBehaviourProcessor.cs index 3ce73366..f974afe9 100644 --- a/QNetWeaver/MonoBehaviourProcessor.cs +++ b/QNetWeaver/MonoBehaviourProcessor.cs @@ -31,6 +31,7 @@ namespace QNetWeaver Weaver.fail = true; } } + if (Helpers.InheritsFromSyncList(fieldDefinition.FieldType)) { Log.Error(string.Format("Script {0} defines field {1} with type {2}, but it's not a NetworkBehaviour", m_td.FullName, fieldDefinition.Name, Helpers.PrettyPrintType(fieldDefinition.FieldType))); @@ -57,6 +58,7 @@ namespace QNetWeaver })); Weaver.fail = true; } + if (customAttribute.AttributeType.FullName == Weaver.ClientRpcType.FullName) { Log.Error(string.Concat(new string[] @@ -69,6 +71,7 @@ namespace QNetWeaver })); Weaver.fail = true; } + if (customAttribute.AttributeType.FullName == Weaver.TargetRpcType.FullName) { Log.Error(string.Concat(new string[] @@ -81,6 +84,7 @@ namespace QNetWeaver })); Weaver.fail = true; } + var text = customAttribute.Constructor.DeclaringType.ToString(); if (text == "UnityEngine.Networking.ServerAttribute") { diff --git a/QNetWeaver/NetworkBehaviourProcessor.cs b/QNetWeaver/NetworkBehaviourProcessor.cs index 8166fe7f..b6973206 100644 --- a/QNetWeaver/NetworkBehaviourProcessor.cs +++ b/QNetWeaver/NetworkBehaviourProcessor.cs @@ -117,12 +117,14 @@ namespace QNetWeaver Weaver.fail = true; return false; } + worker.Append(worker.Create(OpCodes.Ldloc_0)); worker.Append(worker.Create(OpCodes.Ldarg, num)); worker.Append(worker.Create(OpCodes.Call, writeFunc)); num += 1; } } + return true; } @@ -135,6 +137,7 @@ namespace QNetWeaver return; } } + var methodDefinition2 = new MethodDefinition("UNetVersion", MethodAttributes.Private, Weaver.voidType); var ilprocessor = methodDefinition2.Body.GetILProcessor(); ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); @@ -169,6 +172,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + cctorMethodDef.Body.Instructions.RemoveAt(cctorMethodDef.Body.Instructions.Count - 1); } } @@ -191,6 +195,7 @@ namespace QNetWeaver ctorMethodDef.Body.Instructions.RemoveAt(ctorMethodDef.Body.Instructions.Count - 1); break; } + Weaver.fail = true; Log.Error("No .ctor for " + m_td.Name); return; @@ -266,6 +271,7 @@ namespace QNetWeaver GenerateCommandDelegate(ilprocessor2, Weaver.registerSyncListDelegateReference, m_SyncListInvocationFuncs[syncListIndex], field5); syncListIndex++; } + ilprocessor2.Append(ilprocessor2.Create(OpCodes.Ldstr, m_td.Name)); ilprocessor2.Append(ilprocessor2.Create(OpCodes.Ldc_I4, m_QosChannel)); ilprocessor2.Append(ilprocessor2.Create(OpCodes.Call, Weaver.RegisterBehaviourReference)); @@ -274,6 +280,7 @@ namespace QNetWeaver { m_td.Methods.Add(cctorMethodDef); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_td.Attributes = (m_td.Attributes & ~TypeAttributes.BeforeFieldInit); if (m_SyncLists.Count != 0) @@ -288,6 +295,7 @@ namespace QNetWeaver flag2 = true; } } + if (methodDefinition8 != null) { if (methodDefinition8.Body.Instructions.Count != 0) @@ -299,6 +307,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + methodDefinition8.Body.Instructions.RemoveAt(methodDefinition8.Body.Instructions.Count - 1); } } @@ -306,17 +315,20 @@ namespace QNetWeaver { methodDefinition8 = new MethodDefinition("Awake", MethodAttributes.Private, Weaver.voidType); } + var ilprocessor3 = methodDefinition8.Body.GetILProcessor(); if (!flag2) { CheckForCustomBaseClassAwakeMethod(ilprocessor3); } + var num6 = 0; foreach (var fd in m_SyncLists) { GenerateSyncListInitializer(ilprocessor3, fd, num6); num6++; } + ilprocessor3.Append(ilprocessor3.Create(OpCodes.Ret)); if (!flag2) { @@ -339,6 +351,7 @@ namespace QNetWeaver awakeWorker.Append(awakeWorker.Create(OpCodes.Call, methodDefinition)); break; } + baseType = baseType.Resolve().BaseType; } } @@ -356,6 +369,7 @@ namespace QNetWeaver } } } + var method = Weaver.scriptDef.MainModule.ImportReference(Enumerable.First(fd.FieldType.Resolve().Methods, (MethodDefinition x) => x.Name == ".ctor" && !x.HasParameters)); ctorWorker.Append(ctorWorker.Create(OpCodes.Ldarg_0)); ctorWorker.Append(ctorWorker.Create(OpCodes.Newobj, method)); @@ -402,6 +416,7 @@ namespace QNetWeaver return; } } + var methodDefinition2 = new MethodDefinition("OnSerialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.boolType); methodDefinition2.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType))); methodDefinition2.Parameters.Add(new ParameterDefinition("forceAll", ParameterAttributes.None, Weaver.boolType)); @@ -440,6 +455,7 @@ namespace QNetWeaver { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_td.Methods.Add(methodDefinition2); } @@ -469,8 +485,10 @@ namespace QNetWeaver })); return; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc)); } + Weaver.DLog(m_td, $" Finish foreach 1", new object[0]); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4_1)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); @@ -512,10 +530,12 @@ namespace QNetWeaver Weaver.fail = true; return; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc2)); ilprocessor.Append(instruction2); num++; } + Weaver.DLog(m_td, $" Finish foreach 2", new object[0]); WriteDirtyCheck(ilprocessor, false); if (Weaver.generateLogErrors) @@ -523,6 +543,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ldstr, "Injected Serialize " + m_td.Name)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.logErrorReference)); } + if (flag) { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); @@ -533,10 +554,12 @@ namespace QNetWeaver { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_td.Methods.Add(methodDefinition2); Weaver.DLog(m_td, $" Finish", new object[0]); } + Weaver.DLog(m_td, $" Finish", new object[0]); } @@ -554,6 +577,7 @@ namespace QNetWeaver serWorker.Append(serWorker.Create(OpCodes.Ldc_I4_1)); serWorker.Append(serWorker.Create(OpCodes.Stloc_0)); } + serWorker.Append(instruction); } @@ -574,6 +598,7 @@ namespace QNetWeaver } } } + return result; } @@ -599,16 +624,19 @@ namespace QNetWeaver Weaver.fail = true; return false; } + if (methodDefinition.Parameters[0].ParameterType != syncVar.FieldType) { Log.Error("SyncVar Hook function " + text + " has wrong type signature for " + m_td.Name); Weaver.fail = true; return false; } + foundMethod = methodDefinition; return true; } } + Log.Error("SyncVar Hook function " + text + " not found for " + m_td.Name); Weaver.fail = true; return false; @@ -616,6 +644,7 @@ namespace QNetWeaver } } } + return true; } @@ -651,15 +680,18 @@ namespace QNetWeaver { continue; } + if (HasMethod("GetNetworkChannel")) { Log.Error("GetNetworkChannel, is already implemented, please make sure you either use NetworkSettings or GetNetworkChannel"); Weaver.fail = true; return; } + m_QosChannel = (int)customAttributeNamedArgument.Argument.Value; GenerateNetworkChannelSetting(m_QosChannel); } + if (customAttributeNamedArgument.Name == "sendInterval") { if (Math.Abs((float)customAttributeNamedArgument.Argument.Value - 0.1f) > 1E-05f) @@ -670,6 +702,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + GenerateNetworkIntervalSetting((float)customAttributeNamedArgument.Argument.Value); } } @@ -690,6 +723,7 @@ namespace QNetWeaver return; } } + foreach (var fieldDefinition in m_SyncVars) { if (fieldDefinition.FieldType.FullName == Weaver.gameObjectType.FullName) @@ -699,6 +733,7 @@ namespace QNetWeaver methodDefinition = new MethodDefinition("PreStartClient", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType); ilprocessor = methodDefinition.Body.GetILProcessor(); } + var field = m_SyncVarNetIds[m_NetIdFieldCounter]; m_NetIdFieldCounter++; var instruction = ilprocessor.Create(OpCodes.Nop); @@ -714,6 +749,7 @@ namespace QNetWeaver ilprocessor.Append(instruction); } } + if (methodDefinition != null) { ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); @@ -732,6 +768,7 @@ namespace QNetWeaver return; } } + var methodDefinition2 = new MethodDefinition("OnDeserialize", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType); methodDefinition2.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType))); methodDefinition2.Parameters.Add(new ParameterDefinition("initialState", ParameterAttributes.None, Weaver.boolType)); @@ -747,6 +784,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Call, methodReference)); } } + if (m_SyncVars.Count == 0) { ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); @@ -794,11 +832,13 @@ namespace QNetWeaver Weaver.fail = true; return; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc)); ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldDefinition)); } } } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); ilprocessor.Append(instruction); methodDefinition2.Body.InitLocals = true; @@ -839,10 +879,12 @@ namespace QNetWeaver Weaver.fail = true; return; } + if (!CheckForHookFunction(fieldDefinition2, out var methodDefinition3)) { return; } + if (methodDefinition3 == null) { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); @@ -858,14 +900,17 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Call, methodDefinition3)); } } + ilprocessor.Append(instruction2); num++; } + if (Weaver.generateLogErrors) { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldstr, "Injected Deserialize " + m_td.Name)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.logErrorReference)); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_td.Methods.Add(methodDefinition2); } @@ -894,6 +939,7 @@ namespace QNetWeaver Weaver.fail = true; return false; } + worker.Append(worker.Create(OpCodes.Ldarg_1)); worker.Append(worker.Create(OpCodes.Call, readFunc)); if (parameterDefinition.ParameterType.FullName == Weaver.singleType.FullName) @@ -906,6 +952,7 @@ namespace QNetWeaver } } } + return true; } @@ -929,6 +976,7 @@ namespace QNetWeaver AddInvokeParameters(methodDefinition.Parameters); result = methodDefinition; } + return result; } @@ -945,6 +993,7 @@ namespace QNetWeaver { methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType)); } + var ilprocessor = methodDefinition.Body.GetILProcessor(); var label = ilprocessor.Create(OpCodes.Nop); WriteSetupLocals(ilprocessor); @@ -953,6 +1002,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ldstr, "Call Command function " + md.Name)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.logErrorReference)); } + WriteClientActiveCheck(ilprocessor, md.Name, label, "Command function"); var instruction = ilprocessor.Create(OpCodes.Nop); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); @@ -963,6 +1013,7 @@ namespace QNetWeaver { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg, i + 1)); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Call, md)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); ilprocessor.Append(instruction); @@ -995,12 +1046,14 @@ namespace QNetWeaver value = (int)customAttributeNamedArgument.Argument.Value; } } + var text = md.Name; var num = text.IndexOf("InvokeCmd"); if (num > -1) { text = text.Substring("InvokeCmd".Length); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4, value)); @@ -1009,6 +1062,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -1033,6 +1087,7 @@ namespace QNetWeaver AddInvokeParameters(methodDefinition.Parameters); result = methodDefinition; } + return result; } @@ -1056,6 +1111,7 @@ namespace QNetWeaver AddInvokeParameters(methodDefinition.Parameters); result = methodDefinition; } + return result; } @@ -1066,6 +1122,7 @@ namespace QNetWeaver { methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType)); } + var ilprocessor = methodDefinition.Body.GetILProcessor(); var label = ilprocessor.Create(OpCodes.Nop); WriteSetupLocals(ilprocessor); @@ -1106,12 +1163,14 @@ namespace QNetWeaver value = (int)customAttributeNamedArgument.Argument.Value; } } + var text = md.Name; var num = text.IndexOf("InvokeTargetRpc"); if (num > -1) { text = text.Substring("InvokeTargetRpc".Length); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); @@ -1121,6 +1180,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -1131,6 +1191,7 @@ namespace QNetWeaver { methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType)); } + var ilprocessor = methodDefinition.Body.GetILProcessor(); var label = ilprocessor.Create(OpCodes.Nop); WriteSetupLocals(ilprocessor); @@ -1163,12 +1224,14 @@ namespace QNetWeaver value = (int)customAttributeNamedArgument.Argument.Value; } } + var text = md.Name; var num = text.IndexOf("InvokeRpc"); if (num > -1) { text = text.Substring("InvokeRpc".Length); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4, value)); @@ -1177,6 +1240,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -1229,6 +1293,7 @@ namespace QNetWeaver { result = true; } + return result; } @@ -1320,9 +1385,11 @@ namespace QNetWeaver return false; } } + i++; continue; } + Log.Error(string.Concat(new string[] { actionType, @@ -1336,8 +1403,10 @@ namespace QNetWeaver Weaver.fail = true; result = false; } + return result; } + return true; } @@ -1374,6 +1443,7 @@ namespace QNetWeaver { result = (ProcessMethodsValidateFunction(md, ca, "Command") && ProcessMethodsValidateParameters(md, ca, "Command")); } + return result; } @@ -1441,6 +1511,7 @@ namespace QNetWeaver { result = ProcessMethodsValidateParameters(md, ca, "Target Rpc"); } + return result; } @@ -1477,6 +1548,7 @@ namespace QNetWeaver { result = (ProcessMethodsValidateFunction(md, ca, "Rpc") && ProcessMethodsValidateParameters(md, ca, "Rpc")); } + return result; } @@ -1494,6 +1566,7 @@ namespace QNetWeaver { return; } + if (hashSet.Contains(methodDefinition.Name)) { Log.Error(string.Concat(new string[] @@ -1507,6 +1580,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + hashSet.Add(methodDefinition.Name); m_Cmds.Add(methodDefinition); var methodDefinition2 = ProcessCommandInvoke(methodDefinition); @@ -1514,6 +1588,7 @@ namespace QNetWeaver { m_CmdInvocationFuncs.Add(methodDefinition2); } + var methodDefinition3 = ProcessCommandCall(methodDefinition, customAttribute); if (methodDefinition3 != null) { @@ -1521,6 +1596,7 @@ namespace QNetWeaver Weaver.lists.replacedMethods.Add(methodDefinition); Weaver.lists.replacementMethods.Add(methodDefinition3); } + break; } else if (customAttribute.AttributeType.FullName == Weaver.TargetRpcType.FullName) @@ -1529,6 +1605,7 @@ namespace QNetWeaver { return; } + if (hashSet.Contains(methodDefinition.Name)) { Log.Error(string.Concat(new string[] @@ -1542,6 +1619,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + hashSet.Add(methodDefinition.Name); m_TargetRpcs.Add(methodDefinition); var methodDefinition4 = ProcessTargetRpcInvoke(methodDefinition); @@ -1549,6 +1627,7 @@ namespace QNetWeaver { m_TargetRpcInvocationFuncs.Add(methodDefinition4); } + var methodDefinition5 = ProcessTargetRpcCall(methodDefinition, customAttribute); if (methodDefinition5 != null) { @@ -1556,6 +1635,7 @@ namespace QNetWeaver Weaver.lists.replacedMethods.Add(methodDefinition); Weaver.lists.replacementMethods.Add(methodDefinition5); } + break; } else if (customAttribute.AttributeType.FullName == Weaver.ClientRpcType.FullName) @@ -1564,6 +1644,7 @@ namespace QNetWeaver { return; } + if (hashSet.Contains(methodDefinition.Name)) { Log.Error(string.Concat(new string[] @@ -1577,6 +1658,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + hashSet.Add(methodDefinition.Name); m_Rpcs.Add(methodDefinition); var methodDefinition6 = ProcessRpcInvoke(methodDefinition); @@ -1584,6 +1666,7 @@ namespace QNetWeaver { m_RpcInvocationFuncs.Add(methodDefinition6); } + var methodDefinition7 = ProcessRpcCall(methodDefinition, customAttribute); if (methodDefinition7 != null) { @@ -1591,30 +1674,37 @@ namespace QNetWeaver Weaver.lists.replacedMethods.Add(methodDefinition); Weaver.lists.replacementMethods.Add(methodDefinition7); } + break; } } } + foreach (var item in m_CmdInvocationFuncs) { m_td.Methods.Add(item); } + foreach (var item2 in m_CmdCallFuncs) { m_td.Methods.Add(item2); } + foreach (var item3 in m_RpcInvocationFuncs) { m_td.Methods.Add(item3); } + foreach (var item4 in m_TargetRpcInvocationFuncs) { m_td.Methods.Add(item4); } + foreach (var item5 in m_RpcCallFuncs) { m_td.Methods.Add(item5); } + foreach (var item6 in m_TargetRpcCallFuncs) { m_td.Methods.Add(item6); @@ -1632,6 +1722,7 @@ namespace QNetWeaver break; } } + MethodDefinition result; if (fieldDefinition == null) { @@ -1668,6 +1759,7 @@ namespace QNetWeaver result = methodDefinition; } } + return result; } @@ -1679,6 +1771,7 @@ namespace QNetWeaver { methodDefinition.Parameters.Add(new ParameterDefinition(parameterDefinition.Name, ParameterAttributes.None, parameterDefinition.ParameterType)); } + var ilprocessor = methodDefinition.Body.GetILProcessor(); var label = ilprocessor.Create(OpCodes.Nop); WriteSetupLocals(ilprocessor); @@ -1711,6 +1804,7 @@ namespace QNetWeaver value = (int)customAttributeNamedArgument.Argument.Value; } } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldc_I4, value)); @@ -1719,6 +1813,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -1743,6 +1838,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + if (eventDefinition.EventType.Resolve().HasGenericParameters) { Log.Error(string.Concat(new string[] @@ -1756,12 +1852,14 @@ namespace QNetWeaver Weaver.fail = true; return; } + m_Events.Add(eventDefinition); var methodDefinition = ProcessEventInvoke(eventDefinition); if (methodDefinition == null) { return; } + m_td.Methods.Add(methodDefinition); m_EventInvocationFuncs.Add(methodDefinition); Weaver.DLog(m_td, "ProcessEvent " + eventDefinition, new object[0]); @@ -1852,6 +1950,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, Weaver.NetworkBehaviourClientSendUpdateVars)); } + ilprocessor.Append(returnInstruction); methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.In, fd.FieldType)); methodDefinition.SemanticsAttributes = MethodSemanticsAttributes.Setter; @@ -1870,6 +1969,7 @@ namespace QNetWeaver m_SyncVarNetIds.Add(fieldDefinition); Weaver.lists.netIdFields.Add(fieldDefinition); } + var methodDefinition = ProcessSyncVarGet(fd, name); var methodDefinition2 = ProcessSyncVarSet(fd, name, dirtyBit, fieldDefinition); var item = new PropertyDefinition("Network" + name, PropertyAttributes.None, fd.FieldType) @@ -1932,30 +2032,35 @@ namespace QNetWeaver Weaver.fail = true; return; } + if (Weaver.IsDerivedFrom(typeDefinition, Weaver.ScriptableObjectType)) { Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be derived from ScriptableObject."); Weaver.fail = true; return; } + if ((ushort)(fieldDefinition.Attributes & FieldAttributes.Static) != 0) { Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be static."); Weaver.fail = true; return; } + if (typeDefinition.HasGenericParameters) { Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot have generic parameters."); Weaver.fail = true; return; } + if (typeDefinition.IsInterface) { Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be an interface."); Weaver.fail = true; return; } + var name = typeDefinition.Module.Name; if (name != Weaver.scriptDef.MainModule.Name && name != Weaver.UnityAssemblyDefinition.MainModule.Name && name != Weaver.QNetAssemblyDefinition.MainModule.Name && name != Weaver.corLib.Name && name != "System.Runtime.dll") { @@ -1963,17 +2068,20 @@ namespace QNetWeaver Weaver.fail = true; return; } + if (fieldDefinition.FieldType.IsArray) { Log.Error("SyncVar [" + fieldDefinition.FullName + "] cannot be an array. Use a SyncList instead."); Weaver.fail = true; return; } + if (Helpers.InheritsFromSyncList(fieldDefinition.FieldType)) { Log.Warning(string.Format("Script class [{0}] has [SyncVar] attribute on SyncList field {1}, SyncLists should not be marked with SyncVar.", m_td.FullName, fieldDefinition.Name)); break; } + m_SyncVars.Add(fieldDefinition); ProcessSyncVar(fieldDefinition, 1 << num2); num2++; @@ -1991,15 +2099,18 @@ namespace QNetWeaver Weaver.fail = true; return; } + break; } } + if (fieldDefinition.FieldType.FullName.Contains("UnityEngine.Networking.SyncListStruct")) { Log.Error("SyncListStruct member variable [" + fieldDefinition.FullName + "] must use a dervied class, like \"class MySyncList : SyncListStruct {}\"."); Weaver.fail = true; return; } + if (Weaver.IsDerivedFrom(fieldDefinition.FieldType.Resolve(), Weaver.SyncListType)) { if (fieldDefinition.IsStatic) @@ -2015,6 +2126,7 @@ namespace QNetWeaver Weaver.fail = true; return; } + m_SyncVars.Add(fieldDefinition); m_SyncLists.Add(fieldDefinition); list.Add(ProcessSyncList(fieldDefinition, 1 << num2)); @@ -2035,19 +2147,23 @@ namespace QNetWeaver } } } + foreach (var fieldDefinition2 in list) { m_td.Fields.Add(fieldDefinition2); m_SyncListStaticFields.Add(fieldDefinition2); } + foreach (var item in m_SyncVarNetIds) { m_td.Fields.Add(item); } + foreach (var item2 in m_SyncListInvocationFuncs) { m_td.Methods.Add(item2); } + Weaver.SetNumSyncVars(m_td.FullName, num); } @@ -2068,6 +2184,7 @@ namespace QNetWeaver return true; } } + return false; } diff --git a/QNetWeaver/Program.cs b/QNetWeaver/Program.cs index b373e5bc..8891e550 100644 --- a/QNetWeaver/Program.cs +++ b/QNetWeaver/Program.cs @@ -35,6 +35,7 @@ namespace QNetWeaver { throw new Exception("dll could not be located at " + path + "!"); } + Console.WriteLine($"Path OK!"); } @@ -45,6 +46,7 @@ namespace QNetWeaver { throw new Exception("Assembly " + assemblyPath + " does not exist!"); } + Console.WriteLine($"Assembly Path OK!"); } @@ -55,6 +57,7 @@ namespace QNetWeaver { Directory.CreateDirectory(outputDir); } + Console.WriteLine($"Output Path OK!"); } } diff --git a/QNetWeaver/SyncListStructProcessor.cs b/QNetWeaver/SyncListStructProcessor.cs index cd26acda..30bc3d4b 100644 --- a/QNetWeaver/SyncListStructProcessor.cs +++ b/QNetWeaver/SyncListStructProcessor.cs @@ -49,6 +49,7 @@ namespace QNetWeaver { text += "None"; } + var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, Weaver.voidType); methodDefinition.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType))); methodDefinition.Parameters.Add(new ParameterDefinition("instance", ParameterAttributes.None, m_TypeDef)); @@ -105,6 +106,7 @@ namespace QNetWeaver { text += "None"; } + var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, Weaver.voidType); methodDefinition.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType))); methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(m_TypeDef))); @@ -164,6 +166,7 @@ namespace QNetWeaver return methodDefinition; } } + var methodDefinition2 = new MethodDefinition("SerializeItem", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, Weaver.voidType); methodDefinition2.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkWriterType))); methodDefinition2.Parameters.Add(new ParameterDefinition("item", ParameterAttributes.None, m_ItemType)); @@ -198,6 +201,7 @@ namespace QNetWeaver })); return null; } + if (typeDefinition.IsInterface) { Weaver.fail = true; @@ -213,6 +217,7 @@ namespace QNetWeaver })); return null; } + var writeFunc = Weaver.GetWriteFunc(fieldDefinition.FieldType); if (writeFunc == null) { @@ -229,16 +234,19 @@ namespace QNetWeaver })); return null; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_2)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldfld, fieldReference)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc)); } } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_TypeDef.Methods.Add(methodDefinition2); result = methodDefinition2; } + return result; } @@ -252,6 +260,7 @@ namespace QNetWeaver return methodDefinition; } } + var methodDefinition2 = new MethodDefinition("DeserializeItem", MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Virtual | MethodAttributes.HideBySig, m_ItemType); methodDefinition2.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, Weaver.scriptDef.MainModule.ImportReference(Weaver.NetworkReaderType))); var ilprocessor = methodDefinition2.Body.GetILProcessor(); @@ -279,12 +288,14 @@ namespace QNetWeaver })); return null; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloca, 0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc)); ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldReference)); } } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); m_TypeDef.Methods.Add(methodDefinition2); diff --git a/QNetWeaver/Weaver.cs b/QNetWeaver/Weaver.cs index 75b0dd14..8f3ee305 100644 --- a/QNetWeaver/Weaver.cs +++ b/QNetWeaver/Weaver.cs @@ -35,13 +35,17 @@ namespace QNetWeaver { return false; } + continue; } + var typeDefinition = parent.Resolve(); result = (typeDefinition != null); } + return result; } + return true; } @@ -67,6 +71,7 @@ namespace QNetWeaver { result = 0; } + return result; } @@ -91,6 +96,7 @@ namespace QNetWeaver return methodReference; } } + if (variable.IsByReference) { Log.Error("GetWriteFunc variable.IsByReference error."); @@ -107,6 +113,7 @@ namespace QNetWeaver { return null; } + methodDefinition = GenerateArrayWriteFunc(variable, writeFunc); } else @@ -115,8 +122,10 @@ namespace QNetWeaver { return NetworkWriterWriteInt32; } + methodDefinition = GenerateWriterFunction(variable); } + if (methodDefinition == null) { result = null; @@ -128,6 +137,7 @@ namespace QNetWeaver } } } + return result; } @@ -150,6 +160,7 @@ namespace QNetWeaver { result = null; } + return result; } @@ -163,6 +174,7 @@ namespace QNetWeaver return methodReference; } } + var typeDefinition = variable.Resolve(); MethodReference result; if (typeDefinition == null) @@ -186,6 +198,7 @@ namespace QNetWeaver { return null; } + methodDefinition = GenerateArrayReadFunc(variable, readFunc); } else @@ -194,8 +207,10 @@ namespace QNetWeaver { return NetworkReaderReadInt32; } + methodDefinition = GenerateReadFunction(variable); } + if (methodDefinition == null) { Log.Error("GetReadFunc unable to generate function for:" + variable.FullName); @@ -207,6 +222,7 @@ namespace QNetWeaver result = methodDefinition; } } + return result; } @@ -245,6 +261,7 @@ namespace QNetWeaver { text += "None"; } + var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, variable); methodDefinition.Parameters.Add(new ParameterDefinition("reader", ParameterAttributes.None, scriptDef.MainModule.ImportReference(NetworkReaderType))); methodDefinition.Body.Variables.Add(new VariableDefinition(int32Type)); @@ -289,6 +306,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -311,6 +329,7 @@ namespace QNetWeaver { text += "None"; } + var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, voidType); methodDefinition.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, scriptDef.MainModule.ImportReference(NetworkWriterType))); methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.None, scriptDef.MainModule.ImportReference(variable))); @@ -360,6 +379,7 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -381,6 +401,7 @@ namespace QNetWeaver { text += "None"; } + var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, voidType); methodDefinition.Parameters.Add(new ParameterDefinition("writer", ParameterAttributes.None, scriptDef.MainModule.ImportReference(NetworkWriterType))); methodDefinition.Parameters.Add(new ParameterDefinition("value", ParameterAttributes.None, scriptDef.MainModule.ImportReference(variable))); @@ -405,6 +426,7 @@ namespace QNetWeaver })); return null; } + if (fieldDefinition.FieldType.Resolve().IsInterface) { fail = true; @@ -420,6 +442,7 @@ namespace QNetWeaver })); return null; } + var writeFunc = GetWriteFunc(fieldDefinition.FieldType); if (writeFunc == null) { @@ -434,6 +457,7 @@ namespace QNetWeaver fail = true; return null; } + num += 1U; ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_1)); @@ -441,13 +465,16 @@ namespace QNetWeaver ilprocessor.Append(ilprocessor.Create(OpCodes.Call, writeFunc)); } } + if (num == 0U) { Log.Warning("The class / struct " + variable.Name + " has no public or non-static fields to serialize"); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -469,6 +496,7 @@ namespace QNetWeaver { text += "None"; } + var methodDefinition = new MethodDefinition(text, MethodAttributes.FamANDAssem | MethodAttributes.Family | MethodAttributes.Static | MethodAttributes.HideBySig, variable); methodDefinition.Body.Variables.Add(new VariableDefinition(variable)); methodDefinition.Body.InitLocals = true; @@ -487,9 +515,11 @@ namespace QNetWeaver Log.Error("The class " + variable.Name + " has no default constructor or it's private, aborting."); return null; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Newobj, methodDefinition2)); ilprocessor.Append(ilprocessor.Create(OpCodes.Stloc_0)); } + var num = 0U; foreach (var fieldDefinition in variable.Resolve().Fields) { @@ -503,6 +533,7 @@ namespace QNetWeaver { ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc, 0)); } + var readFunc = GetReadFunc(fieldDefinition.FieldType); if (readFunc == null) { @@ -517,20 +548,24 @@ namespace QNetWeaver fail = true; return null; } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldarg_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Call, readFunc)); ilprocessor.Append(ilprocessor.Create(OpCodes.Stfld, fieldDefinition)); num += 1U; } } + if (num == 0U) { Log.Warning("The class / struct " + variable.Name + " has no public or non-static fields to serialize"); } + ilprocessor.Append(ilprocessor.Create(OpCodes.Ldloc_0)); ilprocessor.Append(ilprocessor.Create(OpCodes.Ret)); result = methodDefinition; } + return result; } @@ -549,6 +584,7 @@ namespace QNetWeaver } } } + return null; } @@ -632,6 +668,7 @@ namespace QNetWeaver ProcessInstructionMethod(moduleDef, td, md, i, methodReference, iCount); } } + if (i.OpCode == OpCodes.Stfld) { var fieldDefinition = i.Operand as FieldDefinition; @@ -707,6 +744,7 @@ namespace QNetWeaver ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ldstr, "[Server] function '" + md.FullName + "' called on client")); ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Call, logWarningReference)); } + InjectGuardParameters(md, ilprocessor, instruction); InjectGuardReturnValue(md, ilprocessor, instruction); ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ret)); @@ -730,6 +768,7 @@ namespace QNetWeaver ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ldstr, "[Client] function '" + md.FullName + "' called on server")); ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Call, logWarningReference)); } + InjectGuardParameters(md, ilprocessor, instruction); InjectGuardReturnValue(md, ilprocessor, instruction); ilprocessor.InsertBefore(instruction, ilprocessor.Create(OpCodes.Ret)); @@ -770,6 +809,7 @@ namespace QNetWeaver InjectClientGuard(moduleDef, td, md, false); } } + var num = 0; foreach (var i in md.Body.Instructions) { @@ -789,6 +829,7 @@ namespace QNetWeaver { ProcessSiteMethod(moduleDef, td, md); } + foreach (var td2 in td.NestedTypes) { ProcessSiteClass(moduleDef, td2); @@ -805,6 +846,7 @@ namespace QNetWeaver ProcessSiteClass(moduleDef, typeDefinition); } } + if (lists.generateContainerClass != null) { moduleDef.Types.Add(lists.generateContainerClass); @@ -813,11 +855,13 @@ namespace QNetWeaver { scriptDef.MainModule.ImportReference(method); } + foreach (var method2 in lists.generatedWriteFunctions) { scriptDef.MainModule.ImportReference(method2); } } + Console.WriteLine(string.Concat(new object[] { " ProcessSitesModule ", @@ -859,6 +903,7 @@ namespace QNetWeaver return false; } } + DLog(td, "Found NetworkBehaviour " + td.FullName, new object[0]); var networkBehaviourProcessor = new NetworkBehaviourProcessor(td); networkBehaviourProcessor.Process(); @@ -883,14 +928,17 @@ namespace QNetWeaver return scriptDef.MainModule.ImportReference(methodDefinition); } } + Log.Error($"ResolveMethod failed - Couldn't find {name} in {t.Name}"); foreach (var methodDefinition2 in t.Resolve().Methods) { Log.Error("- has method " + methodDefinition2.Name); } + fail = true; result = null; } + return result; } @@ -909,6 +957,7 @@ namespace QNetWeaver } } } + Log.Error(string.Concat(new object[] { "ResolveMethodWithArg failed ", @@ -931,6 +980,7 @@ namespace QNetWeaver return methodDefinition; } } + return null; } @@ -955,6 +1005,7 @@ namespace QNetWeaver } } } + Log.Error(string.Concat(new object[] { "ResolveMethodGeneric failed ", @@ -977,6 +1028,7 @@ namespace QNetWeaver return scriptDef.MainModule.ImportReference(fieldDefinition); } } + return null; } @@ -989,6 +1041,7 @@ namespace QNetWeaver return scriptDef.MainModule.ImportReference(propertyDefinition.GetMethod); } } + Log.Error($"ResolveProperty failed - Couldn't find {name} in {t.Name}"); return null; } @@ -1000,6 +1053,7 @@ namespace QNetWeaver { Log.Error("Vector2Type is null!"); } + vector3Type = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Vector3"); vector4Type = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Vector4"); colorType = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Color"); @@ -1014,6 +1068,7 @@ namespace QNetWeaver { Log.Error("GameObjectType is null!"); } + transformType = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Transform"); unityObjectType = UnityAssemblyDefinition.MainModule.GetType("UnityEngine.Object"); @@ -1328,6 +1383,7 @@ namespace QNetWeaver { return true; } + try { baseType = baseType.Resolve().BaseType; @@ -1337,8 +1393,10 @@ namespace QNetWeaver break; } } + result = false; } + return result; } @@ -1360,10 +1418,12 @@ namespace QNetWeaver { text = text.Substring(0, num); } + if (text == baseClass.FullName) { return true; } + try { baseType = baseType.Resolve().BaseType; @@ -1373,8 +1433,10 @@ namespace QNetWeaver break; } } + result = false; } + return result; } @@ -1400,6 +1462,7 @@ namespace QNetWeaver { result = true; } + return result; } @@ -1433,6 +1496,7 @@ namespace QNetWeaver { break; } + try { list.Insert(0, typeDefinition); @@ -1443,13 +1507,16 @@ namespace QNetWeaver break; } } + var flag = false; foreach (var td2 in list) { flag |= ProcessNetworkBehaviourType(td2); } + result = flag; } + return result; } @@ -1471,6 +1538,7 @@ namespace QNetWeaver flag |= ProcessMessageType(td); break; } + try { baseType = baseType.Resolve().BaseType; @@ -1480,12 +1548,15 @@ namespace QNetWeaver break; } } + foreach (var td2 in td.NestedTypes) { flag |= CheckMessageBase(td2); } + result = flag; } + return result; } @@ -1507,6 +1578,7 @@ namespace QNetWeaver flag |= ProcessSyncListStructType(td); break; } + try { baseType = baseType.Resolve().BaseType; @@ -1516,12 +1588,15 @@ namespace QNetWeaver break; } } + foreach (var td2 in td.NestedTypes) { flag |= CheckSyncListStruct(td2); } + result = flag; } + return result; } @@ -1560,19 +1635,23 @@ namespace QNetWeaver { scriptDef.MainModule.SymbolReader.Dispose(); } + fail = true; throw ex; } } + if (fail) { if (scriptDef.MainModule.SymbolReader != null) { scriptDef.MainModule.SymbolReader.Dispose(); } + return false; } } + stopwatch.Stop(); Console.WriteLine(string.Concat(new object[] { @@ -1583,12 +1662,14 @@ namespace QNetWeaver " milliseconds" })); } + if (flag) { foreach (var methodDefinition in lists.replacedMethods) { lists.replacementMethodNames.Add(methodDefinition.FullName); } + try { ProcessPropertySites(); @@ -1600,16 +1681,20 @@ namespace QNetWeaver { scriptDef.MainModule.SymbolReader.Dispose(); } + return false; } + if (fail) { if (scriptDef.MainModule.SymbolReader != null) { scriptDef.MainModule.SymbolReader.Dispose(); } + return false; } + var fileName = Helpers.DestinationFileFor(outputDir, assName); var writerParameters = Helpers.GetWriterParameters(readerParameters); if (writerParameters.SymbolWriterProvider is PdbWriterProvider) @@ -1618,12 +1703,15 @@ namespace QNetWeaver var text = Path.ChangeExtension(assName, ".pdb"); File.Delete(text); } + scriptDef.Write(fileName, writerParameters); } + if (scriptDef.MainModule.SymbolReader != null) { scriptDef.MainModule.SymbolReader.Dispose(); } + return true; } @@ -1650,6 +1738,7 @@ namespace QNetWeaver Log.Error("Exception :" + ex); return false; } + corLib = null; return true; }