/// <summary> /// Called from <c>BasePlayer.RespawnAt(Vector3, Quaternion)</c> . /// </summary> public static void On_PlayerRespawn(BasePlayer basePlayer, Vector3 pos, Quaternion quat) { Player player = Server.GetPlayer(basePlayer); var re = new RespawnEvent(player, pos, quat); OnNext("On_PlayerRespawn", re); basePlayer.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false); basePlayer.SetPlayerFlag(BasePlayer.PlayerFlags.HasBuildingPrivilege, false); basePlayer.SetPlayerFlag(BasePlayer.PlayerFlags.InBuildingPrivilege, false); basePlayer.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true); ++ServerPerformance.spawns; basePlayer.transform.position = re.SpawnPos; basePlayer.transform.rotation = re.SpawnRot; (basePlayer.GetFieldValue("tickInterpolator") as TickInterpolator).Reset(pos); basePlayer.SetFieldValue("lastTickTime", 0f); basePlayer.CancelInvoke("WoundingEnd"); basePlayer.StopSpectating(); basePlayer.UpdateNetworkGroup(); basePlayer.UpdatePlayerCollider(true, false); basePlayer.StartSleeping(); basePlayer.Invoke("LifeStoryStart", 0f); basePlayer.metabolism.Reset(); if (re.StartHealth < Single.Epsilon) { basePlayer.InitializeHealth(basePlayer.StartHealth(), basePlayer.StartMaxHealth()); } else { basePlayer.InitializeHealth(re.StartHealth, basePlayer.StartMaxHealth()); } if (re.GiveDefault) { basePlayer.inventory.GiveDefaultItems(); } if (re.WakeUp) { basePlayer.EndSleeping(); } basePlayer.SendNetworkUpdateImmediate(false); basePlayer.ClearEntityQueue(); basePlayer.ClientRPCPlayer(null, basePlayer, "StartLoading"); if (basePlayer.IsConnected()) basePlayer.SendFullSnapshot(); // player.SetPlayerFlag (BasePlayer.PlayerFlags.ReceivingSnapshot, false); // player.ClientRPCPlayer(null, player, "FinishLoading"); }