i'm trying to make Spectate plugin when user dead instantly spectate to player
here's my code
private void StartSpectating(BasePlayer player, BasePlayer target)
{
if (!player.IsSpectating())
{
player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, true);
player.gameObject.SetLayerRecursive(10);
player.CancelInvoke("MetabolismUpdate");
player.CancelInvoke("InventoryUpdate");
player.ClearEntityQueue();
player.SendEntitySnapshot(target);
player.gameObject.Identity();
player.SetParent(target, 0);
if (!SpectatedList.ContainsKey(target))
{
SpectatedList.Add(target, new List<BasePlayer>());
}
if (!SpectatedList[target].Contains(player))
{
SpectatedList[target].Add(player);
}
}
}
private void EndSpectating(BasePlayer player)
{
if (player.IsSpectating())
{
player.SetParent(null, 0);
player.SetPlayerFlag(BasePlayer.PlayerFlags.Spectating, false);
player.gameObject.SetLayerRecursive(17);
player.metabolism.Reset();
player.InvokeRepeating("InventoryUpdate", 1f, 0.1f * UnityEngine.Random.Range(0.99f, 1.01f));
}
}this code for spectate player
codeflow when endround
1. EndSpectating on all players
2.
player.inventory.containerMain?.Clear();
player.inventory.containerWear?.Clear();
player.inventory.containerBelt?.Clear();
ItemManager.DoRemoves();3.
player.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false);
player.InitializeHealth(player.MaxHealth(), player.MaxHealth());
player.metabolism.calories.value = player.metabolism.calories.max;
player.metabolism.hydration.value = player.metabolism.hydration.max;
player.metabolism.bleeding.value = 0;
player.metabolism.radiation_level.value = 0;
player.metabolism.radiation_poison.value = 0;
player.metabolism.SendChangesToClient();
player.SendNetworkUpdateImmediate();4.
public void Teleport(BasePlayer player, Vector3 destination, bool checkGround = false, bool sleep = true)
{
if (player.IsNpc || destination.Equals(Vector3.zero))
return;
if (player.isMounted)
player.GetMounted().DismountPlayer(player, true);
if (player.GetParentEntity() != null)
player.SetParent(null);
if (checkGround)
destination = GetGroundPosition(destination);
TeleportingPlayers.Add(player.userID);
timer.Once(2, () =>
{
TeleportingPlayers.Remove(player.userID);
});
if (sleep)
{
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.MovePosition(destination);
player.UpdateNetworkGroup();
if (player.inventory != null && player.inventory.containerMain != null && player.inventory.containerBelt != null && player.inventory.containerWear != null)
player.StartSleeping();
player.SendNetworkUpdateImmediate(false);
player.ClearEntityQueue(null);
player.ClientRPCPlayer(null, player, "StartLoading");
if (player.net?.subscriber?.subscribed != null)
player.SendFullSnapshot();
}
else
{
player.MovePosition(destination);
player.ClientRPCPlayer(null, player, "ForcePositionTo", destination);
player.SendNetworkUpdateImmediate();
player.ClearEntityQueue(null);
}
}when finished game round all players teleport to custom spawn point
i think crashed on teleport
i try use BasePlayer.StartSpectating and BasePlayer.UpdateSpectateTarget code too but same error on teleport
NullReferenceException: Object reference not set to an instance of an object.
Disconnected (Object reference not set to an instance of an object.
at BaseNetworkable.OnNetworkGroupChange () [0x00000] in <00000000000000000000000000000000>:0
at Network.Networkable.SwitchGroup (Network.Visibility.Group newGroup) [0x00000] in <00000000000000000000000000000000>:0
at Client.OnGroupChange (Network.Message msg) [0x00000] in <00000000000000000000000000000000>:0
at Client.OnNetworkMessage (Network.Message packet) [0x00000] in <00000000000000000000000000000000>:0
at Facepunch.Network.Raknet.Client.HandleMessage () [0x00000] in <00000000000000000000000000000000>:0
at Facepunch.Network.Raknet.Client.Cycle () [0x00000] in <00000000000000000000000000000000>:0
at Client.Update () [0x00000] in <00000000000000000000000000000000>:0 ) - returning to main menu