mirror of
https://github.com/misternebula/quantum-space-buddies.git
synced 2025-02-20 15:41:01 +00:00
actually make this shit work
This commit is contained in:
parent
ab231111f1
commit
1ca7bc8775
@ -20,11 +20,20 @@ namespace QSB.DeathSync.Events
|
||||
NecronomiconIndex = Necronomicon.GetRandomIndex(type)
|
||||
};
|
||||
|
||||
public override void OnReceiveLocal(bool server, PlayerDeathMessage message)
|
||||
{
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
RespawnManager.Instance.OnPlayerDeath(player);
|
||||
}
|
||||
|
||||
public override void OnReceiveRemote(bool server, PlayerDeathMessage message)
|
||||
{
|
||||
var playerName = QSBPlayerManager.GetPlayer(message.AboutId).Name;
|
||||
var player = QSBPlayerManager.GetPlayer(message.AboutId);
|
||||
var playerName = player.Name;
|
||||
var deathMessage = Necronomicon.GetPhrase(message.EnumValue, message.NecronomiconIndex);
|
||||
DebugLog.ToAll(string.Format(deathMessage, playerName));
|
||||
|
||||
RespawnManager.Instance.OnPlayerDeath(player);
|
||||
}
|
||||
}
|
||||
}
|
37
QSB/DeathSync/Events/PlayerRespawnEvent.cs
Normal file
37
QSB/DeathSync/Events/PlayerRespawnEvent.cs
Normal file
@ -0,0 +1,37 @@
|
||||
using QSB.Events;
|
||||
using QSB.Messaging;
|
||||
using QSB.Player;
|
||||
|
||||
namespace QSB.DeathSync.Events
|
||||
{
|
||||
class PlayerRespawnEvent : QSBEvent<PlayerMessage>
|
||||
{
|
||||
public override EventType Type => EventType.PlayerRespawn;
|
||||
|
||||
public override void SetupListener()
|
||||
=> GlobalMessenger<uint>.AddListener(EventNames.QSBPlayerRespawn, Handler);
|
||||
|
||||
public override void CloseListener()
|
||||
=> GlobalMessenger<uint>.RemoveListener(EventNames.QSBPlayerRespawn, Handler);
|
||||
|
||||
private void Handler(uint playerId) => SendEvent(CreateMessage(playerId));
|
||||
|
||||
private PlayerMessage CreateMessage(uint playerId) => new PlayerMessage
|
||||
{
|
||||
AboutId = playerId
|
||||
};
|
||||
|
||||
public override void OnReceiveLocal(bool server, PlayerMessage message)
|
||||
=> OnReceiveRemote(server, message);
|
||||
|
||||
public override void OnReceiveRemote(bool server, PlayerMessage message)
|
||||
{
|
||||
if (message.AboutId == LocalPlayerId)
|
||||
{
|
||||
RespawnManager.Instance.Respawn();
|
||||
}
|
||||
|
||||
RespawnManager.Instance.OnPlayerRespawn(QSBPlayerManager.GetPlayer(message.AboutId));
|
||||
}
|
||||
}
|
||||
}
|
@ -1,12 +1,13 @@
|
||||
using OWML.Utils;
|
||||
using QSB.Patches;
|
||||
using QSB.Utility;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.DeathSync.Patches
|
||||
{
|
||||
class MapPatches : QSBPatch
|
||||
{
|
||||
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
|
||||
public override QSBPatchTypes Type => QSBPatchTypes.RespawnTime;
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
@ -100,12 +101,10 @@ namespace QSB.DeathSync.Patches
|
||||
|
||||
public static bool MapController_LateUpdate(
|
||||
MapController __instance,
|
||||
bool ____isMapMode,
|
||||
ref float ____observatoryRevealTwist,
|
||||
ref float ____defaultPitchAngle,
|
||||
ref float ____initialPitchAngle,
|
||||
OWCamera ____mapCamera,
|
||||
ReferenceFrame ____currentRFrame,
|
||||
ref float ____lockTimer,
|
||||
ref float ____revealTimer,
|
||||
float ____lockOnMoveLength,
|
||||
@ -121,9 +120,7 @@ namespace QSB.DeathSync.Patches
|
||||
ref bool ____interpPosition,
|
||||
ref bool ____interpPitch,
|
||||
ref bool ____interpZoom,
|
||||
ref bool ____framingPlayer,
|
||||
OWCamera ____activeCam,
|
||||
Transform ____targetTransform,
|
||||
ref Vector3 ____position,
|
||||
float ____panSpeed,
|
||||
ref float ____zoom,
|
||||
@ -143,135 +140,97 @@ namespace QSB.DeathSync.Patches
|
||||
float ____observatoryRevealDist
|
||||
)
|
||||
{
|
||||
if (!____isMapMode)
|
||||
____lockTimer = Mathf.Min(____lockTimer + Time.deltaTime, ____lockOnMoveLength);
|
||||
____revealTimer = Mathf.Min(____revealTimer + Time.deltaTime, ____revealLength);
|
||||
var num = Mathf.Clamp01(____revealTimer / ____revealLength);
|
||||
var t3 = Mathf.SmoothStep(0f, 1f, num);
|
||||
var flag = ____revealTimer > ____observatoryInteractDelay;
|
||||
if (____screenPromptsVisible && ____isPaused)
|
||||
{
|
||||
if (OWInput.IsInputMode(InputMode.Character | InputMode.ShipCockpit) && OWInput.IsNewlyPressed(InputLibrary.map, InputMode.All))
|
||||
{
|
||||
if (PlayerState.InBrambleDimension() || PlayerState.OnQuantumMoon())
|
||||
{
|
||||
NotificationManager.SharedInstance.PostNotification(new NotificationData(UITextLibrary.GetString(UITextType.NotificationUnableToOpenMap)), false);
|
||||
}
|
||||
else
|
||||
{
|
||||
__instance.GetType().GetAnyMethod("EnterMapView").Invoke(__instance, new object[] { (____currentRFrame == null || !(____currentRFrame.GetOWRigidBody() != null)) ? null : ____currentRFrame.GetOWRigidBody().transform });
|
||||
}
|
||||
}
|
||||
____closePrompt.SetVisibility(false);
|
||||
____panPrompt.SetVisibility(false);
|
||||
____rotatePrompt.SetVisibility(false);
|
||||
____zoomPrompt.SetVisibility(false);
|
||||
____screenPromptsVisible = false;
|
||||
}
|
||||
else if (!____screenPromptsVisible && flag && !____isPaused)
|
||||
{
|
||||
____closePrompt.SetVisibility(false);
|
||||
____panPrompt.SetVisibility(true);
|
||||
____rotatePrompt.SetVisibility(true);
|
||||
____zoomPrompt.SetVisibility(true);
|
||||
____screenPromptsVisible = true;
|
||||
}
|
||||
|
||||
var vector = Vector2.zero;
|
||||
var vector2 = Vector2.zero;
|
||||
var num2 = 0f;
|
||||
if (flag)
|
||||
{
|
||||
vector = OWInput.GetValue(InputLibrary.moveXZ, InputMode.All);
|
||||
vector2 = InputLibrary.look.GetValue(false);
|
||||
num2 = OWInput.GetValue(InputLibrary.mapZoom, InputMode.All);
|
||||
vector2.y *= -1f;
|
||||
num2 *= -1f;
|
||||
}
|
||||
|
||||
____lockedToTargetTransform &= vector.sqrMagnitude < 0.01f;
|
||||
____interpPosition &= vector.sqrMagnitude < 0.01f;
|
||||
____interpPitch &= Mathf.Abs(vector2.y) < 0.1f;
|
||||
____interpZoom &= Mathf.Abs(num2) < 0.1f;
|
||||
|
||||
if (____interpPosition)
|
||||
{
|
||||
var a = ____activeCam.transform.position - Locator.GetCenterOfTheUniverse().GetOffsetPosition();
|
||||
var b = Vector3.zero;
|
||||
____position = Vector3.Lerp(a, b, t3);
|
||||
}
|
||||
else
|
||||
{
|
||||
____lockTimer = Mathf.Min(____lockTimer + Time.deltaTime, ____lockOnMoveLength);
|
||||
var t = Mathf.Clamp01(____lockTimer / ____lockOnMoveLength);
|
||||
____revealTimer = Mathf.Min(____revealTimer + Time.deltaTime, ____revealLength);
|
||||
var num = Mathf.Clamp01(____revealTimer / ____revealLength);
|
||||
var t3 = Mathf.SmoothStep(0f, 1f, num);
|
||||
var flag = ____revealTimer > ____observatoryInteractDelay;
|
||||
if (____screenPromptsVisible && ____isPaused)
|
||||
var normalized = Vector3.Scale(__instance.transform.forward + __instance.transform.up, new Vector3(1f, 0f, 1f)).normalized;
|
||||
var a2 = (__instance.transform.right * vector.x) + (normalized * vector.y);
|
||||
____position += a2 * ____panSpeed * ____zoom * Time.deltaTime;
|
||||
____position.y = 0f;
|
||||
if (____position.sqrMagnitude > ____maxPanDistance * ____maxPanDistance)
|
||||
{
|
||||
____closePrompt.SetVisibility(false);
|
||||
____panPrompt.SetVisibility(false);
|
||||
____rotatePrompt.SetVisibility(false);
|
||||
____zoomPrompt.SetVisibility(false);
|
||||
____screenPromptsVisible = false;
|
||||
____position = ____position.normalized * ____maxPanDistance;
|
||||
}
|
||||
else if (!____screenPromptsVisible && flag && !____isPaused)
|
||||
{
|
||||
____closePrompt.SetVisibility(false);
|
||||
____panPrompt.SetVisibility(true);
|
||||
____rotatePrompt.SetVisibility(true);
|
||||
____zoomPrompt.SetVisibility(true);
|
||||
____screenPromptsVisible = true;
|
||||
}
|
||||
|
||||
var vector = Vector2.zero;
|
||||
var vector2 = Vector2.zero;
|
||||
var num2 = 0f;
|
||||
if (flag)
|
||||
{
|
||||
vector = OWInput.GetValue(InputLibrary.moveXZ, InputMode.All);
|
||||
vector2 = InputLibrary.look.GetValue(false);
|
||||
num2 = OWInput.GetValue(InputLibrary.mapZoom, InputMode.All);
|
||||
vector2.y *= -1f;
|
||||
num2 *= -1f;
|
||||
}
|
||||
|
||||
____lockedToTargetTransform &= vector.sqrMagnitude < 0.01f;
|
||||
____interpPosition &= vector.sqrMagnitude < 0.01f;
|
||||
____interpPitch &= Mathf.Abs(vector2.y) < 0.1f;
|
||||
____interpZoom &= Mathf.Abs(num2) < 0.1f;
|
||||
____framingPlayer &= ____lockedToTargetTransform && ____interpZoom;
|
||||
if (____interpPosition)
|
||||
{
|
||||
var a = ____activeCam.transform.position - Locator.GetCenterOfTheUniverse().GetOffsetPosition();
|
||||
var b = Vector3.zero;
|
||||
if (____lockedToTargetTransform && ____targetTransform != null)
|
||||
{
|
||||
b = ____targetTransform.position - Locator.GetCenterOfTheUniverse().GetOffsetPosition();
|
||||
b.y = 0f;
|
||||
}
|
||||
|
||||
____position = Vector3.Lerp(a, b, t3);
|
||||
}
|
||||
else if (____lockedToTargetTransform && ____targetTransform != null)
|
||||
{
|
||||
var vector3 = ____targetTransform.position;
|
||||
vector3 -= Locator.GetCenterOfTheUniverse().GetOffsetPosition();
|
||||
vector3.y = 0f;
|
||||
____position = Vector3.Lerp(____position, vector3, t);
|
||||
}
|
||||
else
|
||||
{
|
||||
var normalized = Vector3.Scale(__instance.transform.forward + __instance.transform.up, new Vector3(1f, 0f, 1f)).normalized;
|
||||
var a2 = (__instance.transform.right * vector.x) + (normalized * vector.y);
|
||||
____position += a2 * ____panSpeed * ____zoom * Time.deltaTime;
|
||||
____position.y = 0f;
|
||||
if (____position.sqrMagnitude > ____maxPanDistance * ____maxPanDistance)
|
||||
{
|
||||
____position = ____position.normalized * ____maxPanDistance;
|
||||
}
|
||||
}
|
||||
|
||||
____yaw += vector2.x * ____yawSpeed * Time.deltaTime;
|
||||
____yaw = OWMath.WrapAngle(____yaw);
|
||||
if (____interpPitch)
|
||||
{
|
||||
____pitch = Mathf.Lerp(____initialPitchAngle, ____defaultPitchAngle, t3);
|
||||
}
|
||||
else
|
||||
{
|
||||
____pitch += vector2.y * ____pitchSpeed * Time.deltaTime;
|
||||
____pitch = Mathf.Clamp(____pitch, ____minPitchAngle, ____maxPitchAngle);
|
||||
}
|
||||
|
||||
if (____interpZoom)
|
||||
{
|
||||
if (____framingPlayer)
|
||||
{
|
||||
var num3 = Vector3.Distance(____playerTransform.position, ____targetTransform.position);
|
||||
var value = num3 / Mathf.Tan(0.017453292f * ____mapCamera.fieldOfView * 0.5f) * 1.33f;
|
||||
____targetZoom = Mathf.Clamp(value, ____minZoomDistance, ____maxZoomDistance);
|
||||
}
|
||||
|
||||
____zoom = Mathf.Lerp(____initialZoomDist, ____targetZoom, t3);
|
||||
}
|
||||
else
|
||||
{
|
||||
____zoom += num2 * ____zoomSpeed * Time.deltaTime;
|
||||
____zoom = Mathf.Clamp(____zoom, ____minZoomDistance, ____maxZoomDistance);
|
||||
}
|
||||
|
||||
____mapCamera.nearClipPlane = Mathf.Lerp(0.1f, 1f, t3);
|
||||
var quaternion = Quaternion.Euler(____pitch, ____yaw, 0f);
|
||||
var num4 = num * (2f - num);
|
||||
var num5 = Mathf.SmoothStep(0f, 1f, num4);
|
||||
var a3 = Quaternion.LookRotation(-____playerTransform.up, Vector3.up);
|
||||
var a4 = ____activeCam.transform.position;
|
||||
a4 += ____playerTransform.up * num5 * ____observatoryRevealDist;
|
||||
__instance.transform.rotation = Quaternion.Lerp(a3, quaternion, num5);
|
||||
__instance.transform.rotation *= Quaternion.AngleAxis(Mathf.Lerp(____observatoryRevealTwist, 0f, num4), Vector3.forward);
|
||||
var vector4 = ____position + (-__instance.transform.forward * ____zoom) + Locator.GetCenterOfTheUniverse().GetStaticReferenceFrame().GetPosition();
|
||||
__instance.transform.position = Vector3.Lerp(a4, vector4, num5);
|
||||
}
|
||||
|
||||
____yaw += vector2.x * ____yawSpeed * Time.deltaTime;
|
||||
____yaw = OWMath.WrapAngle(____yaw);
|
||||
if (____interpPitch)
|
||||
{
|
||||
____pitch = Mathf.Lerp(____initialPitchAngle, ____defaultPitchAngle, t3);
|
||||
}
|
||||
else
|
||||
{
|
||||
____pitch += vector2.y * ____pitchSpeed * Time.deltaTime;
|
||||
____pitch = Mathf.Clamp(____pitch, ____minPitchAngle, ____maxPitchAngle);
|
||||
}
|
||||
|
||||
if (____interpZoom)
|
||||
{
|
||||
____zoom = Mathf.Lerp(____initialZoomDist, ____targetZoom, t3);
|
||||
}
|
||||
else
|
||||
{
|
||||
____zoom += num2 * ____zoomSpeed * Time.deltaTime;
|
||||
____zoom = Mathf.Clamp(____zoom, ____minZoomDistance, ____maxZoomDistance);
|
||||
}
|
||||
|
||||
____mapCamera.nearClipPlane = Mathf.Lerp(0.1f, 1f, t3);
|
||||
var quaternion = Quaternion.Euler(____pitch, ____yaw, 0f);
|
||||
var num4 = num * (2f - num);
|
||||
var num5 = Mathf.SmoothStep(0f, 1f, num4);
|
||||
var a3 = Quaternion.LookRotation(-____playerTransform.up, Vector3.up);
|
||||
var a4 = ____activeCam.transform.position;
|
||||
a4 += ____playerTransform.up * num5 * ____observatoryRevealDist;
|
||||
__instance.transform.rotation = Quaternion.Lerp(a3, quaternion, num5);
|
||||
__instance.transform.rotation *= Quaternion.AngleAxis(Mathf.Lerp(____observatoryRevealTwist, 0f, num4), Vector3.forward);
|
||||
var vector4 = ____position + (-__instance.transform.forward * ____zoom) + Locator.GetCenterOfTheUniverse().GetStaticReferenceFrame().GetPosition();
|
||||
__instance.transform.position = Vector3.Lerp(a4, vector4, num5);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
166
QSB/DeathSync/Patches/RespawnPatches.cs
Normal file
166
QSB/DeathSync/Patches/RespawnPatches.cs
Normal file
@ -0,0 +1,166 @@
|
||||
using OWML.Utils;
|
||||
using QSB.Patches;
|
||||
|
||||
namespace QSB.DeathSync.Patches
|
||||
{
|
||||
class RespawnPatches : QSBPatch
|
||||
{
|
||||
public override QSBPatchTypes Type => QSBPatchTypes.OnClientConnect;
|
||||
|
||||
public override void DoPatches()
|
||||
{
|
||||
Prefix(nameof(PlayerRecoveryPoint_OnGainFocus));
|
||||
Prefix(nameof(PlayerRecoveryPoint_OnPressInteract));
|
||||
}
|
||||
|
||||
public static bool PlayerRecoveryPoint_OnGainFocus(
|
||||
PlayerResources ____playerResources,
|
||||
bool ____refuelsPlayer,
|
||||
bool ____healsPlayer,
|
||||
SingleInteractionVolume ____interactVolume
|
||||
)
|
||||
{
|
||||
if (____playerResources == null)
|
||||
{
|
||||
____playerResources = Locator.GetPlayerTransform().GetComponent<PlayerResources>();
|
||||
}
|
||||
|
||||
var isAtFullHealth = ____playerResources.GetHealthFraction() == 1f;
|
||||
var isAtFullFuel = ____playerResources.GetFuelFraction() == 1f;
|
||||
var canBeRefueled = false;
|
||||
var canBeHealed = false;
|
||||
|
||||
if (!isAtFullFuel && ____refuelsPlayer)
|
||||
{
|
||||
canBeRefueled = true;
|
||||
}
|
||||
|
||||
if (!isAtFullHealth && ____healsPlayer)
|
||||
{
|
||||
canBeHealed = true;
|
||||
}
|
||||
|
||||
var showRespawnPrompt = false;
|
||||
|
||||
var uitextType = UITextType.None;
|
||||
if (canBeHealed && canBeRefueled)
|
||||
{
|
||||
// Heal and refuel
|
||||
uitextType = UITextType.RefillPrompt_0;
|
||||
|
||||
____interactVolume.SetKeyCommandVisible(true);
|
||||
}
|
||||
else if (canBeHealed)
|
||||
{
|
||||
// Heal
|
||||
uitextType = UITextType.RefillPrompt_2;
|
||||
|
||||
____interactVolume.SetKeyCommandVisible(true);
|
||||
}
|
||||
else if (canBeRefueled)
|
||||
{
|
||||
// Refuel
|
||||
uitextType = UITextType.RefillPrompt_4;
|
||||
____interactVolume.SetKeyCommandVisible(true);
|
||||
}
|
||||
else if (RespawnManager.Instance.RespawnNeeded)
|
||||
{
|
||||
showRespawnPrompt = true;
|
||||
}
|
||||
else if (____refuelsPlayer && ____healsPlayer)
|
||||
{
|
||||
// Fuel and health full
|
||||
uitextType = UITextType.RefillPrompt_7;
|
||||
____interactVolume.SetKeyCommandVisible(false);
|
||||
}
|
||||
else if (____refuelsPlayer)
|
||||
{
|
||||
// Fuel full
|
||||
uitextType = UITextType.RefillPrompt_8;
|
||||
____interactVolume.SetKeyCommandVisible(false);
|
||||
}
|
||||
else if (____healsPlayer)
|
||||
{
|
||||
// Health full
|
||||
uitextType = UITextType.RefillPrompt_9;
|
||||
____interactVolume.SetKeyCommandVisible(false);
|
||||
}
|
||||
|
||||
if (showRespawnPrompt)
|
||||
{
|
||||
____interactVolume.GetValue<ScreenPrompt>("_screenPrompt").SetText($"<CMD> Respawn Player");
|
||||
____interactVolume.GetValue<ScreenPrompt>("_noCommandIconPrompt").SetText("Respawn Player");
|
||||
}
|
||||
|
||||
if (uitextType != UITextType.None)
|
||||
{
|
||||
____interactVolume.ChangePrompt(uitextType);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static bool PlayerRecoveryPoint_OnPressInteract(
|
||||
PlayerRecoveryPoint __instance,
|
||||
PlayerResources ____playerResources,
|
||||
ref bool ____recovering,
|
||||
bool ____refuelsPlayer,
|
||||
bool ____healsPlayer,
|
||||
PlayerAudioController ____playerAudioController,
|
||||
SingleInteractionVolume ____interactVolume
|
||||
)
|
||||
{
|
||||
var playerNeedsRefueling = ____playerResources.GetFuelFraction() != 1f;
|
||||
var playerNeedsHealing = ____playerResources.GetHealthFraction() != 1f;
|
||||
var canBeInteractedWith = false;
|
||||
|
||||
if (playerNeedsRefueling && ____refuelsPlayer)
|
||||
{
|
||||
canBeInteractedWith = true;
|
||||
}
|
||||
|
||||
if (playerNeedsHealing && ____healsPlayer)
|
||||
{
|
||||
canBeInteractedWith = true;
|
||||
}
|
||||
|
||||
if (RespawnManager.Instance.RespawnNeeded)
|
||||
{
|
||||
canBeInteractedWith = true;
|
||||
}
|
||||
|
||||
if (canBeInteractedWith)
|
||||
{
|
||||
if (RespawnManager.Instance.RespawnNeeded)
|
||||
{
|
||||
RespawnManager.Instance.RespawnSomePlayer();
|
||||
return false;
|
||||
}
|
||||
|
||||
____playerResources.StartRefillResources(____refuelsPlayer, ____healsPlayer);
|
||||
|
||||
if (____playerAudioController != null)
|
||||
{
|
||||
if (playerNeedsRefueling && ____refuelsPlayer)
|
||||
{
|
||||
____playerAudioController.PlayRefuel();
|
||||
}
|
||||
|
||||
if (playerNeedsHealing && ____healsPlayer)
|
||||
{
|
||||
____playerAudioController.PlayMedkit();
|
||||
}
|
||||
}
|
||||
|
||||
____recovering = true;
|
||||
__instance.enabled = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
____interactVolume.ResetInteraction();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
93
QSB/DeathSync/RespawnManager.cs
Normal file
93
QSB/DeathSync/RespawnManager.cs
Normal file
@ -0,0 +1,93 @@
|
||||
using OWML.Utils;
|
||||
using QSB.Events;
|
||||
using QSB.Patches;
|
||||
using QSB.Player;
|
||||
using QSB.Utility;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace QSB.DeathSync
|
||||
{
|
||||
class RespawnManager : MonoBehaviour
|
||||
{
|
||||
public static RespawnManager Instance;
|
||||
|
||||
public bool RespawnNeeded => _playersPendingRespawn.Count != 0;
|
||||
|
||||
private List<PlayerInfo> _playersPendingRespawn = new List<PlayerInfo>();
|
||||
private NotificationData _previousNotification;
|
||||
|
||||
private void Start()
|
||||
=> Instance = this;
|
||||
|
||||
public void TriggerRespawnMap()
|
||||
{
|
||||
QSBPatchManager.DoPatchType(QSBPatchTypes.RespawnTime);
|
||||
QSBCore.UnityEvents.FireOnNextUpdate(() => GlobalMessenger.FireEvent("TriggerObservatoryMap"));
|
||||
}
|
||||
|
||||
public void Respawn()
|
||||
{
|
||||
var mapController = FindObjectOfType<MapController>();
|
||||
QSBPatchManager.DoUnpatchType(QSBPatchTypes.RespawnTime);
|
||||
|
||||
var playerSpawner = FindObjectOfType<PlayerSpawner>();
|
||||
playerSpawner.DebugWarp(playerSpawner.GetSpawnPoint(SpawnLocation.Ship));
|
||||
|
||||
mapController.GetType().GetAnyMethod("ExitMapView").Invoke(mapController, null);
|
||||
|
||||
var cameraEffectController = Locator.GetPlayerCamera().GetComponent<PlayerCameraEffectController>();
|
||||
cameraEffectController.OpenEyes(1f, false);
|
||||
}
|
||||
|
||||
public void OnPlayerDeath(PlayerInfo player)
|
||||
{
|
||||
if (_playersPendingRespawn.Contains(player))
|
||||
{
|
||||
DebugLog.ToConsole($"Warning - Received death message for player who is already in _playersPendingRespawn!", OWML.Common.MessageType.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
_playersPendingRespawn.Add(player);
|
||||
UpdateRespawnNotification();
|
||||
|
||||
QSBPlayerManager.ChangePlayerVisibility(player.PlayerId, false);
|
||||
}
|
||||
|
||||
public void OnPlayerRespawn(PlayerInfo player)
|
||||
{
|
||||
if (!_playersPendingRespawn.Contains(player))
|
||||
{
|
||||
DebugLog.ToConsole($"Warning - Received respawn message for player who is not in _playersPendingRespawn!", OWML.Common.MessageType.Warning);
|
||||
return;
|
||||
}
|
||||
|
||||
_playersPendingRespawn.Remove(player);
|
||||
UpdateRespawnNotification();
|
||||
|
||||
QSBPlayerManager.ChangePlayerVisibility(player.PlayerId, true);
|
||||
}
|
||||
|
||||
public void RespawnSomePlayer()
|
||||
{
|
||||
var playerToRespawn = _playersPendingRespawn.First();
|
||||
QSBEventManager.FireEvent(EventNames.QSBPlayerRespawn, playerToRespawn.PlayerId);
|
||||
}
|
||||
|
||||
private void UpdateRespawnNotification()
|
||||
{
|
||||
NotificationManager.SharedInstance.UnpinNotification(_previousNotification);
|
||||
|
||||
if (_playersPendingRespawn.Count == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var data = new NotificationData(NotificationTarget.Player, $"[{_playersPendingRespawn.Count}] PLAYER(S) AWAITING RESPAWN");
|
||||
NotificationManager.SharedInstance.PostNotification(data, true);
|
||||
_previousNotification = data;
|
||||
}
|
||||
}
|
||||
}
|
@ -45,6 +45,8 @@ namespace QSB.DeathSync
|
||||
Init();
|
||||
}
|
||||
|
||||
RespawnManager.Instance.TriggerRespawnMap();
|
||||
|
||||
// Cant use _playerSpawner.DebugWarp because that will warp the ship if the player is in it
|
||||
var playerBody = Locator.GetPlayerBody();
|
||||
playerBody.WarpToPositionRotation(_playerSpawnPoint.transform.position, _playerSpawnPoint.transform.rotation);
|
||||
|
@ -77,5 +77,6 @@
|
||||
public static string QSBComponentDamaged = "QSBComponentDamaged";
|
||||
public static string QSBComponentRepaired = "QSBComponentRepaired";
|
||||
public static string QSBComponentRepairTick = "QSBComponentRepairTick";
|
||||
public static string QSBPlayerRespawn = "QSBPlayerRespawn";
|
||||
}
|
||||
}
|
@ -53,6 +53,7 @@
|
||||
HullRepairTick,
|
||||
ComponentDamaged,
|
||||
ComponentRepaired,
|
||||
ComponentRepairTick
|
||||
ComponentRepairTick,
|
||||
PlayerRespawn
|
||||
}
|
||||
}
|
@ -55,6 +55,7 @@ namespace QSB.Events
|
||||
new EnterExitRoastingEvent(),
|
||||
new MarshmallowEventEvent(),
|
||||
new AnimationTriggerEvent(),
|
||||
new PlayerRespawnEvent(),
|
||||
// World Objects
|
||||
new ElevatorEvent(),
|
||||
new GeyserEvent(),
|
||||
|
@ -60,7 +60,8 @@ namespace QSB.Patches
|
||||
new ShipPatches(),
|
||||
new InputPatches(),
|
||||
new TimePatches(),
|
||||
new MapPatches()
|
||||
new MapPatches(),
|
||||
new RespawnPatches()
|
||||
};
|
||||
|
||||
DebugLog.DebugWrite("Patch Manager ready.", MessageType.Success);
|
||||
|
@ -4,6 +4,7 @@
|
||||
{
|
||||
OnClientConnect = 0,
|
||||
OnNonServerClientConnect = 1,
|
||||
OnServerClientConnect = 2
|
||||
OnServerClientConnect = 2,
|
||||
RespawnTime = 3
|
||||
}
|
||||
}
|
@ -141,9 +141,12 @@
|
||||
<Compile Include="ConversationSync\Events\ConversationStartEndMessage.cs" />
|
||||
<Compile Include="ConversationSync\ConversationType.cs" />
|
||||
<Compile Include="ConversationSync\ConversationManager.cs" />
|
||||
<Compile Include="DeathSync\Events\PlayerRespawnEvent.cs" />
|
||||
<Compile Include="DeathSync\Patches\MapPatches.cs" />
|
||||
<Compile Include="DeathSync\Events\PlayerDeathMessage.cs" />
|
||||
<Compile Include="DeathSync\Patches\DeathPatches.cs" />
|
||||
<Compile Include="DeathSync\Patches\RespawnPatches.cs" />
|
||||
<Compile Include="DeathSync\RespawnManager.cs" />
|
||||
<Compile Include="ElevatorSync\WorldObjects\QSBElevator.cs" />
|
||||
<Compile Include="ElevatorSync\Events\ElevatorEvent.cs" />
|
||||
<Compile Include="ElevatorSync\ElevatorManager.cs" />
|
||||
|
@ -5,6 +5,7 @@ using OWML.Utils;
|
||||
using QSB.Animation.NPC;
|
||||
using QSB.CampfireSync;
|
||||
using QSB.ConversationSync;
|
||||
using QSB.DeathSync;
|
||||
using QSB.ElevatorSync;
|
||||
using QSB.GeyserSync;
|
||||
using QSB.Inputs;
|
||||
@ -91,6 +92,7 @@ namespace QSB
|
||||
gameObject.AddComponent<RepeatingManager>();
|
||||
gameObject.AddComponent<PlayerEntanglementWatcher>();
|
||||
gameObject.AddComponent<DebugGUI>();
|
||||
gameObject.AddComponent<RespawnManager>();
|
||||
|
||||
// WorldObject managers
|
||||
gameObject.AddComponent<QuantumManager>();
|
||||
|
Loading…
x
Reference in New Issue
Block a user