using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Runtime.InteropServices; using System.Text; using JetBrains.Annotations; using Rewired; using RoR2.Networking; using RoR2.Stats; using Unity; using UnityEngine; using UnityEngine.Networking; namespace RoR2; [RequireComponent(typeof(NetworkLoadout))] public class NetworkUser : NetworkBehaviour { public delegate void NetworkUserGenericDelegate(NetworkUser networkUser); private static readonly List instancesList; public static readonly ReadOnlyCollection readOnlyInstancesList; private static readonly List localPlayers; public static readonly ReadOnlyCollection readOnlyLocalPlayersList; [SyncVar(hook = "OnSyncId")] private NetworkUserId _id; [SyncVar] public byte rewiredPlayerId; [SyncVar(hook = "OnSyncMasterObjectId")] private NetworkInstanceId _masterObjectId; [CanBeNull] public LocalUser localUser; public CameraRigController cameraRigController; public string userName = ""; [SyncVar] public Color32 userColor = Color.red; [SyncVar] private uint netLunarCoins; [SyncVar] public ItemIndex rebirthItem = ItemIndex.None; private MemoizedGetComponent cachedMaster; private MemoizedGetComponent cachedPlayerCharacterMasterController; private MemoizedGetComponent cachedPlayerStatsComponent; private GameObject _masterObject; [NonSerialized] [SyncVar(hook = "SetBodyPreference")] public BodyIndex bodyIndexPreference = BodyIndex.None; private float secondAccumulator; [NonSerialized] public List unlockables = new List(); public List debugUnlockablesList = new List(); private static NetworkInstanceId serverCurrentStage; private NetworkInstanceId _serverLastStageAcknowledgedByClient; private static int kRpcRpcDeductLunarCoins; private static int kCmdCmdAwardLunarCoins; private static int kCmdCmdStoreRebirthItems; private static int kRpcRpcStoreRebirthItems; private static int kCmdCmdSetRebirthItems; private static int kRpcRpcAwardLunarCoins; private static int kCmdCmdSetNetLunarCoins; private static int kCmdCmdSetBodyPreference; private static int kCmdCmdSendConsoleCommand; private static int kCmdCmdSendNewUnlockables; private static int kRpcRpcRequestUnlockables; private static int kCmdCmdReportAchievement; private static int kCmdCmdReportUnlock; private static int kCmdCmdAcknowledgeStage; private static int kCmdCmdSubmitVote; public NetworkLoadout networkLoadout { get; private set; } public NetworkUserId id { get { return _id; } set { if (!_id.Equals(value)) { Network_id = value; UpdateUserName(); } } } public bool authed => id.HasValidValue(); public Player inputPlayer => localUser?.inputPlayer; public uint lunarCoins { get { if (localUser != null) { return localUser.userProfile.coins; } return netLunarCoins; } } public CharacterMaster master => cachedMaster.Get(masterObject); public PlayerCharacterMasterController masterController => cachedPlayerCharacterMasterController.Get(masterObject); public PlayerStatsComponent masterPlayerStatsComponent => cachedPlayerStatsComponent.Get(masterObject); public GameObject masterObject { get { if (!_masterObject) { _masterObject = Util.FindNetworkObject(_masterObjectId); } return _masterObject; } set { if ((bool)value) { Network_masterObjectId = value.GetComponent().netId; _masterObject = value; } else { Network_masterObjectId = NetworkInstanceId.Invalid; _masterObject = null; } } } public bool isParticipating => masterObject; public bool isSplitScreenExtraPlayer => id.subId != 0; public bool serverIsClientLoaded { get; private set; } private NetworkInstanceId serverLastStageAcknowledgedByClient { get { return _serverLastStageAcknowledgedByClient; } set { if (!(_serverLastStageAcknowledgedByClient == value)) { _serverLastStageAcknowledgedByClient = value; if (serverCurrentStage == _serverLastStageAcknowledgedByClient) { serverIsClientLoaded = true; NetworkUser.onNetworkUserLoadedSceneServer?.Invoke(this); } } } } public NetworkUserId Network_id { get { return _id; } [param: In] set { if (NetworkServer.localClientActive && !base.syncVarHookGuard) { base.syncVarHookGuard = true; OnSyncId(value); base.syncVarHookGuard = false; } SetSyncVar(value, ref _id, 1u); } } public byte NetworkrewiredPlayerId { get { return rewiredPlayerId; } [param: In] set { SetSyncVar(value, ref rewiredPlayerId, 2u); } } public NetworkInstanceId Network_masterObjectId { get { return _masterObjectId; } [param: In] set { if (NetworkServer.localClientActive && !base.syncVarHookGuard) { base.syncVarHookGuard = true; OnSyncMasterObjectId(value); base.syncVarHookGuard = false; } SetSyncVar(value, ref _masterObjectId, 4u); } } public Color32 NetworkuserColor { get { return userColor; } [param: In] set { SetSyncVar(value, ref userColor, 8u); } } public uint NetworknetLunarCoins { get { return netLunarCoins; } [param: In] set { SetSyncVar(value, ref netLunarCoins, 16u); } } public ItemIndex NetworkrebirthItem { get { return rebirthItem; } [param: In] set { ulong newValueAsUlong = (ulong)value; ulong fieldValueAsUlong = (ulong)rebirthItem; SetSyncVarEnum(value, newValueAsUlong, ref rebirthItem, fieldValueAsUlong, 32u); } } public BodyIndex NetworkbodyIndexPreference { get { return bodyIndexPreference; } [param: In] set { if (NetworkServer.localClientActive && !base.syncVarHookGuard) { base.syncVarHookGuard = true; SetBodyPreference(value); base.syncVarHookGuard = false; } ulong newValueAsUlong = (ulong)value; ulong fieldValueAsUlong = (ulong)bodyIndexPreference; SetSyncVarEnum(value, newValueAsUlong, ref bodyIndexPreference, fieldValueAsUlong, 64u); } } public static event Action onNetworkUserLoadedSceneServer; public static event Action onLoadoutChangedGlobal; [Obsolete("Use onPostNetworkUserStart instead", false)] public static event NetworkUserGenericDelegate OnPostNetworkUserStart { add { onPostNetworkUserStart += value; } remove { onPostNetworkUserStart -= value; } } public static event NetworkUserGenericDelegate onPostNetworkUserStart; [Obsolete("Use onNetworkUserUnlockablesUpdated instead", false)] public static event NetworkUserGenericDelegate OnNetworkUserUnlockablesUpdated { add { onNetworkUserUnlockablesUpdated += value; } remove { onNetworkUserUnlockablesUpdated -= value; } } public static event NetworkUserGenericDelegate onNetworkUserUnlockablesUpdated; public static event NetworkUserGenericDelegate onNetworkUserDiscovered; public static event NetworkUserGenericDelegate onNetworkUserLost; public static event NetworkUserGenericDelegate onNetworkUserBodyPreferenceChanged; [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)] private static void Init() { UserProfile.onUnlockableGranted += delegate(UserProfile userProfile, UnlockableDef unlockableDef) { if (NetworkClient.active) { NetworkUser networkUser3 = FindNetworkUserByUserProfile(userProfile); if ((bool)networkUser3) { networkUser3.SendServerUnlockables(); } } }; UserProfile.onLoadoutChangedGlobal += delegate(UserProfile userProfile) { if (NetworkClient.active) { NetworkUser networkUser2 = FindNetworkUserByUserProfile(userProfile); if ((bool)networkUser2) { networkUser2.PullLoadoutFromUserProfile(); } } }; UserProfile.onSurvivorPreferenceChangedGlobal += delegate(UserProfile userProfile) { if (NetworkClient.active) { NetworkUser networkUser = FindNetworkUserByUserProfile(userProfile); if ((bool)networkUser) { networkUser.SetSurvivorPreferenceClient(userProfile.GetSurvivorPreference()); } } }; Stage.onStageStartGlobal += delegate(Stage stage) { if (NetworkServer.active) { serverCurrentStage = stage.netId; } foreach (NetworkUser localPlayer in localPlayers) { localPlayer.CallCmdAcknowledgeStage(stage.netId); } }; } private void OnEnable() { instancesList.Add(this); NetworkUser.onNetworkUserDiscovered?.Invoke(this); } private void OnDisable() { NetworkUser.onNetworkUserLost?.Invoke(this); instancesList.Remove(this); } private void Awake() { UnityEngine.Object.DontDestroyOnLoad(base.gameObject); networkLoadout = GetComponent(); networkLoadout.onLoadoutUpdated += OnLoadoutUpdated; } private void OnLoadoutUpdated() { NetworkUser.onLoadoutChangedGlobal?.Invoke(this); } private void PullLoadoutFromUserProfile() { UserProfile userProfile = localUser?.userProfile; if (userProfile != null) { Loadout loadout = Loadout.RequestInstance(); userProfile.CopyLoadout(loadout); networkLoadout.SetLoadout(loadout); Loadout.ReturnInstance(loadout); } } private void Start() { if (base.isLocalPlayer) { LocalUserManager.FindLocalUser(base.playerControllerId)?.LinkNetworkUser(this); PullLoadoutFromUserProfile(); if (!Run.instance || bodyIndexPreference == BodyIndex.None) { SetSurvivorPreferenceClient(localUser.userProfile.GetSurvivorPreference()); } } if ((bool)Run.instance) { Run.instance.OnUserAdded(this); } if (NetworkClient.active) { SyncLunarCoinsToServer(); SyncRebirthItemsToServer(); SendServerUnlockables(); } OnLoadoutUpdated(); NetworkUser.onPostNetworkUserStart?.Invoke(this); if (base.isLocalPlayer && (bool)Stage.instance) { CallCmdAcknowledgeStage(Stage.instance.netId); } } private void OnDestroy() { localPlayers.Remove(this); Run.instance?.OnUserRemoved(this); RunCameraManager.instance?.OnUserRemoved(this); localUser?.UnlinkNetworkUser(); } public void BumpDLCChecker() { NetworkUser.onPostNetworkUserStart(this); } public override void OnStartLocalPlayer() { base.OnStartLocalPlayer(); if (!localPlayers.Contains(this)) { localPlayers.Add(this); } else { Debug.LogError("OnStartLocalPlayer Already has THIS local player!"); } StringBuilder stringBuilder = new StringBuilder(); stringBuilder.AppendLine($"OnStartLocalPlayer LOCAL_PLAYERS COUNT {localPlayers.Count}:"); foreach (NetworkUser localPlayer in localPlayers) { stringBuilder.AppendLine("\t" + localPlayer.id.strValue); } } public override void OnStartClient() { UpdateUserName(); } private void OnSyncId(NetworkUserId newId) { id = newId; } private void OnSyncMasterObjectId(NetworkInstanceId newValue) { _masterObject = null; Network_masterObjectId = newValue; } public NetworkPlayerName GetNetworkPlayerName() { NetworkPlayerName result = default(NetworkPlayerName); result.nameOverride = ((id.strValue != null) ? id.strValue : null); result.playerId = ((!string.IsNullOrEmpty(id.strValue)) ? default(PlatformID) : new PlatformID(id.value)); return result; } [Server] public void DeductLunarCoins(uint count) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::DeductLunarCoins(System.UInt32)' called on client"); return; } NetworknetLunarCoins = HGMath.UintSafeSubtract(netLunarCoins, count); CallRpcDeductLunarCoins(count); } [ClientRpc] private void RpcDeductLunarCoins(uint count) { if (localUser != null) { localUser.userProfile.coins = HGMath.UintSafeSubtract(localUser.userProfile.coins, count); SyncLunarCoinsToServer(); } } [Server] public void AwardLunarCoins(uint count) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::AwardLunarCoins(System.UInt32)' called on client"); return; } NetworknetLunarCoins = HGMath.UintSafeAdd(netLunarCoins, count); CallRpcAwardLunarCoins(count); } [Command] public void CmdAwardLunarCoins(uint count) { AwardLunarCoins(count); } [Command] public void CmdStoreRebirthItems(ItemIndex item) { StoreRebirthItems(item); } [Server] private void StoreRebirthItems(ItemIndex item) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::StoreRebirthItems(RoR2.ItemIndex)' called on client"); return; } NetworkrebirthItem = item; CallRpcStoreRebirthItems(item); } [ClientRpc] private void RpcStoreRebirthItems(ItemIndex item) { if (localUser != null) { localUser.userProfile.RebirthItem = PickupCatalog.GetPickupDef(PickupCatalog.FindPickupIndex(item))?.internalName; SyncRebirthItemsToServer(); } } [Client] private void SyncRebirthItemsToServer() { if (!NetworkClient.active) { Debug.LogWarning("[Client] function 'System.Void RoR2.NetworkUser::SyncRebirthItemsToServer()' called on server"); } else if (localUser != null) { UserProfile userProfile = localUser.userProfile; if (!string.IsNullOrEmpty(userProfile.RebirthItem)) { CallCmdSetRebirthItems((userProfile.RebirthItem != null) ? PickupCatalog.GetPickupDef(PickupCatalog.FindPickupIndex(userProfile.RebirthItem)).itemIndex : ItemIndex.None); } } } [Command] private void CmdSetRebirthItems(ItemIndex item) { NetworkrebirthItem = item; } [ClientRpc] private void RpcAwardLunarCoins(uint count) { if (localUser != null) { _ = localUser.userProfile.name; localUser.userProfile.coins = HGMath.UintSafeAdd(localUser.userProfile.coins, count); localUser.userProfile.totalCollectedCoins = HGMath.UintSafeAdd(localUser.userProfile.totalCollectedCoins, count); SyncLunarCoinsToServer(); } } [Client] private void SyncLunarCoinsToServer() { if (!NetworkClient.active) { Debug.LogWarning("[Client] function 'System.Void RoR2.NetworkUser::SyncLunarCoinsToServer()' called on server"); } else if (localUser != null) { CallCmdSetNetLunarCoins(localUser.userProfile.coins); } } [Command] private void CmdSetNetLunarCoins(uint newNetLunarCoins) { NetworknetLunarCoins = newNetLunarCoins; } public CharacterBody GetCurrentBody() { CharacterMaster characterMaster = master; if ((bool)characterMaster) { return characterMaster.GetBody(); } return null; } [Server] public void CopyLoadoutFromMaster() { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::CopyLoadoutFromMaster()' called on client"); } else { networkLoadout.SetLoadout(master.loadout); } } [Server] public void CopyLoadoutToMaster() { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::CopyLoadoutToMaster()' called on client"); return; } Loadout loadout = Loadout.RequestInstance(); networkLoadout.CopyLoadout(loadout); master.SetLoadoutServer(loadout); Loadout.ReturnInstance(loadout); } private void SetBodyPreference(BodyIndex newBodyIndexPreference) { NetworkbodyIndexPreference = newBodyIndexPreference; NetworkUser.onNetworkUserBodyPreferenceChanged?.Invoke(this); } [Command] public void CmdSetBodyPreference(BodyIndex newBodyIndexPreference) { SetBodyPreference(newBodyIndexPreference); } [Client] public void SetSurvivorPreferenceClient(SurvivorDef survivorDef) { if (!NetworkClient.active) { Debug.LogWarning("[Client] function 'System.Void RoR2.NetworkUser::SetSurvivorPreferenceClient(RoR2.SurvivorDef)' called on server"); return; } if (!survivorDef) { throw new ArgumentException("Provided object is null or invalid", "survivorDef"); } BodyIndex bodyIndexFromSurvivorIndex = SurvivorCatalog.GetBodyIndexFromSurvivorIndex(survivorDef ? survivorDef.survivorIndex : SurvivorIndex.None); CallCmdSetBodyPreference(bodyIndexFromSurvivorIndex); } public SurvivorDef GetSurvivorPreference() { return SurvivorCatalog.GetSurvivorDef(SurvivorCatalog.GetSurvivorIndexFromBodyIndex(bodyIndexPreference)); } private void Update() { if (localUser == null) { return; } if (Time.timeScale != 0f) { secondAccumulator += Time.unscaledDeltaTime; } if (!(secondAccumulator >= 1f)) { return; } secondAccumulator -= 1f; if (!Run.instance) { return; } localUser.userProfile.totalRunSeconds++; if ((bool)masterObject) { CharacterMaster component = masterObject.GetComponent(); if ((bool)component && component.hasBody) { localUser.userProfile.totalAliveSeconds++; } } } public void UpdateUserName() { userName = GetNetworkPlayerName().GetResolvedName(); } [Command] public void CmdSendConsoleCommand(string commandName, string[] args) { Console.instance.RunClientCmd(this, commandName, args); } [Client] public void SendServerUnlockables() { if (!NetworkClient.active) { Debug.LogWarning("[Client] function 'System.Void RoR2.NetworkUser::SendServerUnlockables()' called on server"); } else if (localUser != null) { int unlockableCount = localUser.userProfile.statSheet.GetUnlockableCount(); UnlockableIndex[] array = new UnlockableIndex[unlockableCount]; for (int i = 0; i < unlockableCount; i++) { array[i] = localUser.userProfile.statSheet.GetUnlockableIndex(i); } CallCmdSendNewUnlockables(array); } } [Command] private void CmdSendNewUnlockables(UnlockableIndex[] newUnlockableIndices) { unlockables.Clear(); debugUnlockablesList.Clear(); int i = 0; for (int num = newUnlockableIndices.Length; i < num; i++) { UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(newUnlockableIndices[i]); if (unlockableDef != null) { unlockables.Add(unlockableDef); debugUnlockablesList.Add(unlockableDef.cachedName); } } NetworkUser.onNetworkUserUnlockablesUpdated?.Invoke(this); } [Server] public void ServerRequestUnlockables() { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::ServerRequestUnlockables()' called on client"); } else { CallRpcRequestUnlockables(); } } [ClientRpc] private void RpcRequestUnlockables() { if (Util.HasEffectiveAuthority(base.gameObject)) { SendServerUnlockables(); } } [Command] public void CmdReportAchievement(string achievementNameToken) { Chat.SubjectFormatChatMessage subjectFormatChatMessage = new Chat.SubjectFormatChatMessage(); subjectFormatChatMessage.baseToken = "ACHIEVEMENT_UNLOCKED_MESSAGE"; subjectFormatChatMessage.subjectAsNetworkUser = this; subjectFormatChatMessage.paramTokens = new string[1] { achievementNameToken }; Chat.SendBroadcastChat(subjectFormatChatMessage); } [Command] public void CmdReportUnlock(UnlockableIndex unlockIndex) { Debug.LogFormat("NetworkUser.CmdReportUnlock({0})", unlockIndex); UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(unlockIndex); if (unlockableDef != null) { ServerHandleUnlock(unlockableDef); } } [Server] public void ServerHandleUnlock([NotNull] UnlockableDef unlockableDef) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::ServerHandleUnlock(RoR2.UnlockableDef)' called on client"); return; } Debug.LogFormat("NetworkUser.ServerHandleUnlock({0})", unlockableDef.cachedName); if ((bool)masterObject) { PlayerStatsComponent component = masterObject.GetComponent(); if ((bool)component) { component.currentStats.AddUnlockable(unlockableDef); component.ForceNextTransmit(); } } } [Server] public void ServerRemoveUnlock(UnlockableIndex index) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.NetworkUser::ServerRemoveUnlock(RoR2.UnlockableIndex)' called on client"); return; } UnlockableDef unlockableDef = UnlockableCatalog.GetUnlockableDef(index); Debug.LogFormat("NetworkUser.ServerRemoveUnlock({0})", unlockableDef.cachedName); if ((bool)masterObject) { PlayerStatsComponent component = masterObject.GetComponent(); if ((bool)component) { component.currentStats.RemoveUnlockable(index); component.ForceNextTransmit(); } } (localUser?.userProfile)?.RevokeUnlockable(unlockableDef); } [Command] public void CmdAcknowledgeStage(NetworkInstanceId stageNetworkId) { serverLastStageAcknowledgedByClient = stageNetworkId; } [Command] public void CmdSubmitVote(GameObject voteControllerGameObject, int choiceIndex) { if ((bool)voteControllerGameObject) { VoteController component = voteControllerGameObject.GetComponent(); if ((bool)component) { component.ReceiveUserVote(this, choiceIndex); } } } public static bool AllParticipatingNetworkUsersReady() { ReadOnlyCollection readOnlyCollection = readOnlyInstancesList; for (int i = 0; i < readOnlyCollection.Count; i++) { NetworkUser networkUser = readOnlyCollection[i]; if (networkUser.isParticipating && !networkUser.connectionToClient.isReady) { return false; } } return true; } [CanBeNull] private static NetworkUser FindNetworkUserByUserProfile([NotNull] UserProfile userProfile) { if (userProfile == null) { throw new ArgumentNullException("userProfile"); } ReadOnlyCollection readOnlyLocalUsersList = LocalUserManager.readOnlyLocalUsersList; for (int i = 0; i < readOnlyLocalUsersList.Count; i++) { LocalUser localUser = readOnlyLocalUsersList[i]; if (localUser.userProfile == userProfile) { return localUser.currentNetworkUser; } } return null; } static NetworkUser() { instancesList = new List(); readOnlyInstancesList = new ReadOnlyCollection(instancesList); localPlayers = new List(); readOnlyLocalPlayersList = new ReadOnlyCollection(localPlayers); kCmdCmdAwardLunarCoins = 654823536; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdAwardLunarCoins, InvokeCmdCmdAwardLunarCoins); kCmdCmdStoreRebirthItems = -2063320580; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdStoreRebirthItems, InvokeCmdCmdStoreRebirthItems); kCmdCmdSetRebirthItems = 1883408829; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdSetRebirthItems, InvokeCmdCmdSetRebirthItems); kCmdCmdSetNetLunarCoins = -934763456; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdSetNetLunarCoins, InvokeCmdCmdSetNetLunarCoins); kCmdCmdSetBodyPreference = 234442470; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdSetBodyPreference, InvokeCmdCmdSetBodyPreference); kCmdCmdSendConsoleCommand = -1997680971; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdSendConsoleCommand, InvokeCmdCmdSendConsoleCommand); kCmdCmdSendNewUnlockables = 1855027350; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdSendNewUnlockables, InvokeCmdCmdSendNewUnlockables); kCmdCmdReportAchievement = -1674656990; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdReportAchievement, InvokeCmdCmdReportAchievement); kCmdCmdReportUnlock = -1831223439; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdReportUnlock, InvokeCmdCmdReportUnlock); kCmdCmdAcknowledgeStage = -2118585573; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdAcknowledgeStage, InvokeCmdCmdAcknowledgeStage); kCmdCmdSubmitVote = 329593659; NetworkBehaviour.RegisterCommandDelegate(typeof(NetworkUser), kCmdCmdSubmitVote, InvokeCmdCmdSubmitVote); kRpcRpcDeductLunarCoins = -1554352898; NetworkBehaviour.RegisterRpcDelegate(typeof(NetworkUser), kRpcRpcDeductLunarCoins, InvokeRpcRpcDeductLunarCoins); kRpcRpcStoreRebirthItems = -669811482; NetworkBehaviour.RegisterRpcDelegate(typeof(NetworkUser), kRpcRpcStoreRebirthItems, InvokeRpcRpcStoreRebirthItems); kRpcRpcAwardLunarCoins = -604060198; NetworkBehaviour.RegisterRpcDelegate(typeof(NetworkUser), kRpcRpcAwardLunarCoins, InvokeRpcRpcAwardLunarCoins); kRpcRpcRequestUnlockables = -1809653515; NetworkBehaviour.RegisterRpcDelegate(typeof(NetworkUser), kRpcRpcRequestUnlockables, InvokeRpcRpcRequestUnlockables); NetworkCRC.RegisterBehaviour("NetworkUser", 0); } private void UNetVersion() { } protected static void InvokeCmdCmdAwardLunarCoins(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdAwardLunarCoins called on client."); } else { ((NetworkUser)obj).CmdAwardLunarCoins(reader.ReadPackedUInt32()); } } protected static void InvokeCmdCmdStoreRebirthItems(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdStoreRebirthItems called on client."); } else { ((NetworkUser)obj).CmdStoreRebirthItems((ItemIndex)reader.ReadInt32()); } } protected static void InvokeCmdCmdSetRebirthItems(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdSetRebirthItems called on client."); } else { ((NetworkUser)obj).CmdSetRebirthItems((ItemIndex)reader.ReadInt32()); } } protected static void InvokeCmdCmdSetNetLunarCoins(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdSetNetLunarCoins called on client."); } else { ((NetworkUser)obj).CmdSetNetLunarCoins(reader.ReadPackedUInt32()); } } protected static void InvokeCmdCmdSetBodyPreference(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdSetBodyPreference called on client."); } else { ((NetworkUser)obj).CmdSetBodyPreference((BodyIndex)reader.ReadInt32()); } } protected static void InvokeCmdCmdSendConsoleCommand(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdSendConsoleCommand called on client."); } else { ((NetworkUser)obj).CmdSendConsoleCommand(reader.ReadString(), GeneratedNetworkCode._ReadArrayString_None(reader)); } } protected static void InvokeCmdCmdSendNewUnlockables(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdSendNewUnlockables called on client."); } else { ((NetworkUser)obj).CmdSendNewUnlockables(GeneratedNetworkCode._ReadArrayUnlockableIndex_None(reader)); } } protected static void InvokeCmdCmdReportAchievement(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdReportAchievement called on client."); } else { ((NetworkUser)obj).CmdReportAchievement(reader.ReadString()); } } protected static void InvokeCmdCmdReportUnlock(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdReportUnlock called on client."); } else { ((NetworkUser)obj).CmdReportUnlock((UnlockableIndex)reader.ReadInt32()); } } protected static void InvokeCmdCmdAcknowledgeStage(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdAcknowledgeStage called on client."); } else { ((NetworkUser)obj).CmdAcknowledgeStage(reader.ReadNetworkId()); } } protected static void InvokeCmdCmdSubmitVote(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkServer.active) { Debug.LogError("Command CmdSubmitVote called on client."); } else { ((NetworkUser)obj).CmdSubmitVote(reader.ReadGameObject(), (int)reader.ReadPackedUInt32()); } } public void CallCmdAwardLunarCoins(uint count) { if (!NetworkClient.active) { Debug.LogError("Command function CmdAwardLunarCoins called on server."); return; } if (base.isServer) { CmdAwardLunarCoins(count); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdAwardLunarCoins); networkWriter.Write(GetComponent().netId); networkWriter.WritePackedUInt32(count); SendCommandInternal(networkWriter, 0, "CmdAwardLunarCoins"); } public void CallCmdStoreRebirthItems(ItemIndex item) { if (!NetworkClient.active) { Debug.LogError("Command function CmdStoreRebirthItems called on server."); return; } if (base.isServer) { CmdStoreRebirthItems(item); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdStoreRebirthItems); networkWriter.Write(GetComponent().netId); networkWriter.Write((int)item); SendCommandInternal(networkWriter, 0, "CmdStoreRebirthItems"); } public void CallCmdSetRebirthItems(ItemIndex item) { if (!NetworkClient.active) { Debug.LogError("Command function CmdSetRebirthItems called on server."); return; } if (base.isServer) { CmdSetRebirthItems(item); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdSetRebirthItems); networkWriter.Write(GetComponent().netId); networkWriter.Write((int)item); SendCommandInternal(networkWriter, 0, "CmdSetRebirthItems"); } public void CallCmdSetNetLunarCoins(uint newNetLunarCoins) { if (!NetworkClient.active) { Debug.LogError("Command function CmdSetNetLunarCoins called on server."); return; } if (base.isServer) { CmdSetNetLunarCoins(newNetLunarCoins); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdSetNetLunarCoins); networkWriter.Write(GetComponent().netId); networkWriter.WritePackedUInt32(newNetLunarCoins); SendCommandInternal(networkWriter, 0, "CmdSetNetLunarCoins"); } public void CallCmdSetBodyPreference(BodyIndex newBodyIndexPreference) { if (!NetworkClient.active) { Debug.LogError("Command function CmdSetBodyPreference called on server."); return; } if (base.isServer) { CmdSetBodyPreference(newBodyIndexPreference); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdSetBodyPreference); networkWriter.Write(GetComponent().netId); networkWriter.Write((int)newBodyIndexPreference); SendCommandInternal(networkWriter, 0, "CmdSetBodyPreference"); } public void CallCmdSendConsoleCommand(string commandName, string[] args) { if (!NetworkClient.active) { Debug.LogError("Command function CmdSendConsoleCommand called on server."); return; } if (base.isServer) { CmdSendConsoleCommand(commandName, args); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdSendConsoleCommand); networkWriter.Write(GetComponent().netId); networkWriter.Write(commandName); GeneratedNetworkCode._WriteArrayString_None(networkWriter, args); SendCommandInternal(networkWriter, 0, "CmdSendConsoleCommand"); } public void CallCmdSendNewUnlockables(UnlockableIndex[] newUnlockableIndices) { if (!NetworkClient.active) { Debug.LogError("Command function CmdSendNewUnlockables called on server."); return; } if (base.isServer) { CmdSendNewUnlockables(newUnlockableIndices); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdSendNewUnlockables); networkWriter.Write(GetComponent().netId); GeneratedNetworkCode._WriteArrayUnlockableIndex_None(networkWriter, newUnlockableIndices); SendCommandInternal(networkWriter, 0, "CmdSendNewUnlockables"); } public void CallCmdReportAchievement(string achievementNameToken) { if (!NetworkClient.active) { Debug.LogError("Command function CmdReportAchievement called on server."); return; } if (base.isServer) { CmdReportAchievement(achievementNameToken); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdReportAchievement); networkWriter.Write(GetComponent().netId); networkWriter.Write(achievementNameToken); SendCommandInternal(networkWriter, 0, "CmdReportAchievement"); } public void CallCmdReportUnlock(UnlockableIndex unlockIndex) { if (!NetworkClient.active) { Debug.LogError("Command function CmdReportUnlock called on server."); return; } if (base.isServer) { CmdReportUnlock(unlockIndex); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdReportUnlock); networkWriter.Write(GetComponent().netId); networkWriter.Write((int)unlockIndex); SendCommandInternal(networkWriter, 0, "CmdReportUnlock"); } public void CallCmdAcknowledgeStage(NetworkInstanceId stageNetworkId) { if (!NetworkClient.active) { Debug.LogError("Command function CmdAcknowledgeStage called on server."); return; } if (base.isServer) { CmdAcknowledgeStage(stageNetworkId); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdAcknowledgeStage); networkWriter.Write(GetComponent().netId); networkWriter.Write(stageNetworkId); SendCommandInternal(networkWriter, 0, "CmdAcknowledgeStage"); } public void CallCmdSubmitVote(GameObject voteControllerGameObject, int choiceIndex) { if (!NetworkClient.active) { Debug.LogError("Command function CmdSubmitVote called on server."); return; } if (base.isServer) { CmdSubmitVote(voteControllerGameObject, choiceIndex); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)5); networkWriter.WritePackedUInt32((uint)kCmdCmdSubmitVote); networkWriter.Write(GetComponent().netId); networkWriter.Write(voteControllerGameObject); networkWriter.WritePackedUInt32((uint)choiceIndex); SendCommandInternal(networkWriter, 0, "CmdSubmitVote"); } protected static void InvokeRpcRpcDeductLunarCoins(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError("RPC RpcDeductLunarCoins called on server."); } else { ((NetworkUser)obj).RpcDeductLunarCoins(reader.ReadPackedUInt32()); } } protected static void InvokeRpcRpcStoreRebirthItems(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError("RPC RpcStoreRebirthItems called on server."); } else { ((NetworkUser)obj).RpcStoreRebirthItems((ItemIndex)reader.ReadInt32()); } } protected static void InvokeRpcRpcAwardLunarCoins(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError("RPC RpcAwardLunarCoins called on server."); } else { ((NetworkUser)obj).RpcAwardLunarCoins(reader.ReadPackedUInt32()); } } protected static void InvokeRpcRpcRequestUnlockables(NetworkBehaviour obj, NetworkReader reader) { if (!NetworkClient.active) { Debug.LogError("RPC RpcRequestUnlockables called on server."); } else { ((NetworkUser)obj).RpcRequestUnlockables(); } } public void CallRpcDeductLunarCoins(uint count) { if (!NetworkServer.active) { Debug.LogError("RPC Function RpcDeductLunarCoins called on client."); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)2); networkWriter.WritePackedUInt32((uint)kRpcRpcDeductLunarCoins); networkWriter.Write(GetComponent().netId); networkWriter.WritePackedUInt32(count); SendRPCInternal(networkWriter, 0, "RpcDeductLunarCoins"); } public void CallRpcStoreRebirthItems(ItemIndex item) { if (!NetworkServer.active) { Debug.LogError("RPC Function RpcStoreRebirthItems called on client."); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)2); networkWriter.WritePackedUInt32((uint)kRpcRpcStoreRebirthItems); networkWriter.Write(GetComponent().netId); networkWriter.Write((int)item); SendRPCInternal(networkWriter, 0, "RpcStoreRebirthItems"); } public void CallRpcAwardLunarCoins(uint count) { if (!NetworkServer.active) { Debug.LogError("RPC Function RpcAwardLunarCoins called on client."); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)2); networkWriter.WritePackedUInt32((uint)kRpcRpcAwardLunarCoins); networkWriter.Write(GetComponent().netId); networkWriter.WritePackedUInt32(count); SendRPCInternal(networkWriter, 0, "RpcAwardLunarCoins"); } public void CallRpcRequestUnlockables() { if (!NetworkServer.active) { Debug.LogError("RPC Function RpcRequestUnlockables called on client."); return; } NetworkWriter networkWriter = new NetworkWriter(); networkWriter.Write((short)0); networkWriter.Write((short)2); networkWriter.WritePackedUInt32((uint)kRpcRpcRequestUnlockables); networkWriter.Write(GetComponent().netId); SendRPCInternal(networkWriter, 0, "RpcRequestUnlockables"); } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { GeneratedNetworkCode._WriteNetworkUserId_None(writer, _id); writer.WritePackedUInt32(rewiredPlayerId); writer.Write(_masterObjectId); writer.Write(userColor); writer.WritePackedUInt32(netLunarCoins); writer.Write((int)rebirthItem); writer.Write((int)bodyIndexPreference); return true; } bool flag = false; if ((base.syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } GeneratedNetworkCode._WriteNetworkUserId_None(writer, _id); } if ((base.syncVarDirtyBits & 2u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.WritePackedUInt32(rewiredPlayerId); } if ((base.syncVarDirtyBits & 4u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.Write(_masterObjectId); } if ((base.syncVarDirtyBits & 8u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.Write(userColor); } if ((base.syncVarDirtyBits & 0x10u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.WritePackedUInt32(netLunarCoins); } if ((base.syncVarDirtyBits & 0x20u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.Write((int)rebirthItem); } if ((base.syncVarDirtyBits & 0x40u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.Write((int)bodyIndexPreference); } if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { _id = GeneratedNetworkCode._ReadNetworkUserId_None(reader); rewiredPlayerId = (byte)reader.ReadPackedUInt32(); _masterObjectId = reader.ReadNetworkId(); userColor = reader.ReadColor32(); netLunarCoins = reader.ReadPackedUInt32(); rebirthItem = (ItemIndex)reader.ReadInt32(); bodyIndexPreference = (BodyIndex)reader.ReadInt32(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { OnSyncId(GeneratedNetworkCode._ReadNetworkUserId_None(reader)); } if (((uint)num & 2u) != 0) { rewiredPlayerId = (byte)reader.ReadPackedUInt32(); } if (((uint)num & 4u) != 0) { OnSyncMasterObjectId(reader.ReadNetworkId()); } if (((uint)num & 8u) != 0) { userColor = reader.ReadColor32(); } if (((uint)num & 0x10u) != 0) { netLunarCoins = reader.ReadPackedUInt32(); } if (((uint)num & 0x20u) != 0) { rebirthItem = (ItemIndex)reader.ReadInt32(); } if (((uint)num & 0x40u) != 0) { SetBodyPreference((BodyIndex)reader.ReadInt32()); } } public override void PreStartClient() { } }