using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Runtime.InteropServices; using HG; using RoR2.Items; using RoR2.Stats; using UnityEngine; using UnityEngine.Networking; namespace RoR2; public class DotController : NetworkBehaviour { public enum DotIndex { None = -1, Bleed, Burn, Helfire, PercentBurn, Poison, Blight, SuperBleed, StrongerBurn, Fracture, LunarRuin, Count } public class DotDef { public float interval; public float damageCoefficient; public DamageColorIndex damageColorIndex; public BuffDef associatedBuff; public BuffDef terminalTimedBuff; public float terminalTimedBuffDuration; public bool resetTimerOnAdd; } private class DotStack { public DotIndex dotIndex; public DotDef dotDef; public GameObject attackerObject; public TeamIndex attackerTeam; public float timer; public float damage; public DamageTypeCombo damageType; public void Reset() { dotIndex = DotIndex.Bleed; dotDef = null; attackerObject = null; attackerTeam = TeamIndex.Neutral; timer = 0f; damage = 0f; damageType = default(DamageTypeCombo); } } private sealed class DotStackPool : BasePool { protected override void ResetItem(DotStack item) { item.Reset(); } } private class PendingDamage { public GameObject attackerObject; public float totalDamage; public DamageTypeCombo damageType; public void Reset() { attackerObject = null; totalDamage = 0f; damageType = default(DamageTypeCombo); } } private sealed class PendingDamagePool : BasePool { protected override void ResetItem(PendingDamage item) { item.Reset(); } } public delegate void OnDotInflictedServerGlobalDelegate(DotController dotController, ref InflictDotInfo inflictDotInfo); public const float minDamagePerTick = 1f; private static DotDef[] dotDefs; private static readonly Dictionary dotControllerLocator = new Dictionary(); private static readonly List instancesList = new List(); public static readonly ReadOnlyCollection readOnlyInstancesList = instancesList.AsReadOnly(); public static GameObject FractureImpactEffectPrefab; public static GameObject HelfireIgniteEffectPrefab; public static GameObject DotControllerPrefab; [SyncVar] private NetworkInstanceId victimObjectId; private GameObject _victimObject; private CharacterBody _victimBody; private BurnEffectController burnEffectController; private BurnEffectController strongerBurnEffectController; private BurnEffectController helfireEffectController; private BurnEffectController poisonEffectController; private BurnEffectController blightEffectController; private EffectManagerHelper bleedEffect; private EffectManagerHelper superBleedEffect; private EffectManagerHelper preFractureEffect; [SyncVar] private uint activeDotFlags; private static readonly DotStackPool dotStackPool = new DotStackPool(); private List dotStackList; private float[] dotTimers; private static readonly PendingDamagePool pendingDamagePool = new PendingDamagePool(); private int recordedVictimInstanceId = -1; public GameObject victimObject { get { if (!_victimObject) { if (NetworkServer.active) { _victimObject = NetworkServer.FindLocalObject(victimObjectId); } else if (NetworkClient.active) { _victimObject = ClientScene.FindLocalObject(victimObjectId); } } return _victimObject; } set { NetworkvictimObjectId = value.GetComponent().netId; } } private CharacterBody victimBody { get { if (!_victimBody && (bool)victimObject) { _victimBody = victimObject.GetComponent(); } return _victimBody; } } private HealthComponent victimHealthComponent => victimBody?.healthComponent; private TeamIndex victimTeam { get { if (!victimBody) { return TeamIndex.None; } return victimBody.teamComponent.teamIndex; } } public NetworkInstanceId NetworkvictimObjectId { get { return victimObjectId; } [param: In] set { SetSyncVar(value, ref victimObjectId, 1u); } } public uint NetworkactiveDotFlags { get { return activeDotFlags; } [param: In] set { SetSyncVar(value, ref activeDotFlags, 2u); } } public static event OnDotInflictedServerGlobalDelegate onDotInflictedServerGlobal; public static DotDef GetDotDef(DotIndex dotIndex) { if (dotIndex < DotIndex.Bleed || dotIndex >= DotIndex.Count) { return null; } return dotDefs[(int)dotIndex]; } [SystemInitializer(new Type[] { typeof(BuffCatalog) })] private static void InitDotCatalog() { dotDefs = new DotDef[10]; dotDefs[0] = new DotDef { interval = 0.25f, damageCoefficient = 0.2f, damageColorIndex = DamageColorIndex.Bleed, associatedBuff = RoR2Content.Buffs.Bleeding }; dotDefs[1] = new DotDef { interval = 0.2f, damageCoefficient = 0.1f, damageColorIndex = DamageColorIndex.Item, associatedBuff = RoR2Content.Buffs.OnFire, terminalTimedBuff = RoR2Content.Buffs.OnFire, terminalTimedBuffDuration = 1f }; dotDefs[7] = new DotDef { interval = 0.2f, damageCoefficient = 0.1f, damageColorIndex = DamageColorIndex.Item, associatedBuff = DLC1Content.Buffs.StrongerBurn, terminalTimedBuff = DLC1Content.Buffs.StrongerBurn, terminalTimedBuffDuration = 1f }; dotDefs[3] = new DotDef { interval = 0.2f, damageCoefficient = 0.1f, damageColorIndex = DamageColorIndex.Item, associatedBuff = RoR2Content.Buffs.OnFire }; dotDefs[2] = new DotDef { interval = 0.2f, damageCoefficient = 0.02f, damageColorIndex = DamageColorIndex.Item }; dotDefs[4] = new DotDef { interval = 0.333f, damageCoefficient = 0.333f, damageColorIndex = DamageColorIndex.Poison, associatedBuff = RoR2Content.Buffs.Poisoned }; dotDefs[5] = new DotDef { interval = 0.333f, damageCoefficient = 0.2f, damageColorIndex = DamageColorIndex.Poison, associatedBuff = RoR2Content.Buffs.Blight }; dotDefs[6] = new DotDef { interval = 0.25f, damageCoefficient = 0.333f, damageColorIndex = DamageColorIndex.SuperBleed, associatedBuff = RoR2Content.Buffs.SuperBleed }; dotDefs[8] = new DotDef { interval = 3f, damageCoefficient = 4f, damageColorIndex = DamageColorIndex.Void, associatedBuff = DLC1Content.Buffs.Fracture, resetTimerOnAdd = false }; dotDefs[9] = new DotDef { interval = 3f, damageCoefficient = 0f, damageColorIndex = DamageColorIndex.Default, associatedBuff = DLC2Content.Buffs.lunarruin, resetTimerOnAdd = true }; } public bool HasDotActive(DotIndex dotIndex) { return (activeDotFlags & (1 << (int)dotIndex)) != 0; } private void Awake() { if (NetworkServer.active) { dotStackList = new List(); dotTimers = new float[10]; } instancesList.Add(this); } private void OnDestroy() { if (NetworkServer.active) { for (int num = dotStackList.Count - 1; num >= 0; num--) { RemoveDotStackAtServer(num); } } instancesList.Remove(this); if (recordedVictimInstanceId != -1) { dotControllerLocator.Remove(recordedVictimInstanceId); } } private void FixedUpdate() { if (!victimObject) { if (NetworkServer.active) { HandleDestroy(); } return; } UpdateDotVisuals(); if (!NetworkServer.active) { return; } for (DotIndex dotIndex = DotIndex.Bleed; dotIndex < DotIndex.Count; dotIndex++) { uint num = (uint)(1 << (int)dotIndex); if ((activeDotFlags & num) == 0) { continue; } DotDef dotDef = GetDotDef(dotIndex); float num2 = dotTimers[(int)dotIndex] - Time.fixedDeltaTime; if (num2 <= 0f) { num2 += dotDef.interval; int remainingActive = 0; EvaluateDotStacksForType(dotIndex, dotDef.interval, out remainingActive); NetworkactiveDotFlags = activeDotFlags & ~num; if (remainingActive != 0) { NetworkactiveDotFlags = activeDotFlags | num; } } dotTimers[(int)dotIndex] = num2; } if (dotStackList.Count == 0) { HandleDestroy(); } } private void HandleDestroy() { RepoolEffect(ref bleedEffect); RepoolEffect(ref superBleedEffect); RepoolEffect(ref preFractureEffect); UnityEngine.Object.Destroy(base.gameObject); } private EffectManagerHelper GetPooledEffect(string _path) { return EffectManager.GetAndActivatePooledEffect(LegacyResourcesAPI.Load(_path), base.transform, inResetLocal: true); } private void RepoolEffect(ref EffectManagerHelper emh) { if ((bool)emh) { if (emh.OwningPool != null) { emh.transform.SetParent(null); emh.ReturnToPool(); } else { UnityEngine.Object.Destroy(emh.gameObject); } emh = null; } } private void UpdateDotVisuals() { if (!victimBody) { return; } ModelLocator modelLocator = null; base.transform.position = victimBody.corePosition; if ((activeDotFlags & (true ? 1u : 0u)) != 0) { if (!bleedEffect) { bleedEffect = GetPooledEffect("Prefabs/BleedEffect"); } } else if ((bool)bleedEffect) { RepoolEffect(ref bleedEffect); } if ((activeDotFlags & 2u) != 0 || (activeDotFlags & 8u) != 0) { if (!burnEffectController) { modelLocator = (modelLocator ? modelLocator : victimObject.GetComponent()); if ((bool)modelLocator && (bool)modelLocator.modelTransform) { burnEffectController = base.gameObject.AddComponent(); burnEffectController.effectType = BurnEffectController.normalEffect; burnEffectController.target = modelLocator.modelTransform.gameObject; } } } else if ((bool)burnEffectController) { burnEffectController.HandleDestroy(); burnEffectController = null; } if ((activeDotFlags & 0x80u) != 0) { if (!strongerBurnEffectController) { modelLocator = (modelLocator ? modelLocator : victimObject.GetComponent()); if ((bool)modelLocator && (bool)modelLocator.modelTransform) { strongerBurnEffectController = base.gameObject.AddComponent(); strongerBurnEffectController.effectType = BurnEffectController.strongerBurnEffect; strongerBurnEffectController.target = modelLocator.modelTransform.gameObject; } } } else if ((bool)strongerBurnEffectController) { strongerBurnEffectController.HandleDestroy(); strongerBurnEffectController = null; } if ((activeDotFlags & 4u) != 0) { if (!helfireEffectController) { modelLocator = (modelLocator ? modelLocator : victimObject.GetComponent()); if ((bool)modelLocator && (bool)modelLocator.modelTransform) { helfireEffectController = base.gameObject.AddComponent(); helfireEffectController.effectType = BurnEffectController.helfireEffect; helfireEffectController.target = modelLocator.modelTransform.gameObject; } } } else if ((bool)helfireEffectController) { helfireEffectController.HandleDestroy(); helfireEffectController = null; } if ((activeDotFlags & 0x10u) != 0) { if (!poisonEffectController) { modelLocator = (modelLocator ? modelLocator : victimObject.GetComponent()); if ((bool)modelLocator && (bool)modelLocator.modelTransform) { poisonEffectController = base.gameObject.AddComponent(); poisonEffectController.effectType = BurnEffectController.poisonEffect; poisonEffectController.target = modelLocator.modelTransform.gameObject; } } } else if ((bool)poisonEffectController) { poisonEffectController.HandleDestroy(); poisonEffectController = null; } if ((activeDotFlags & 0x20u) != 0) { if (!blightEffectController) { modelLocator = (modelLocator ? modelLocator : victimObject.GetComponent()); if ((bool)modelLocator && (bool)modelLocator.modelTransform) { blightEffectController = base.gameObject.AddComponent(); blightEffectController.effectType = BurnEffectController.blightEffect; blightEffectController.target = modelLocator.modelTransform.gameObject; } } } else if ((bool)blightEffectController) { blightEffectController.HandleDestroy(); blightEffectController = null; } if ((activeDotFlags & 0x40u) != 0) { if (!superBleedEffect) { superBleedEffect = GetPooledEffect("Prefabs/SuperBleedEffect"); } } else if ((bool)superBleedEffect) { RepoolEffect(ref superBleedEffect); } if ((activeDotFlags & 0x100u) != 0) { if (!preFractureEffect) { preFractureEffect = GetPooledEffect("Prefabs/PreFractureEffect"); } } else if ((bool)preFractureEffect) { RepoolEffect(ref preFractureEffect); } } private void LateUpdate() { if ((bool)victimObject) { base.transform.position = victimObject.transform.position; } } private static void AddPendingDamageEntry(List pendingDamages, GameObject attackerObject, float damage, DamageTypeCombo damageType) { for (int i = 0; i < pendingDamages.Count; i++) { if (pendingDamages[i].attackerObject == attackerObject) { pendingDamages[i].totalDamage += damage; return; } } PendingDamage pendingDamage = pendingDamagePool.Request(); pendingDamage.attackerObject = attackerObject; pendingDamage.totalDamage = damage; pendingDamage.damageType = damageType; pendingDamages.Add(pendingDamage); } private void OnDotStackAddedServer(DotStack dotStack) { DotDef dotDef = dotStack.dotDef; if (dotDef.associatedBuff != null && (bool)victimBody) { victimBody.AddBuff(dotDef.associatedBuff.buffIndex); } } private void OnDotStackRemovedServer(DotStack dotStack) { DotDef dotDef = dotStack.dotDef; if ((bool)victimBody) { if (dotDef.associatedBuff != null) { victimBody.RemoveBuff(dotDef.associatedBuff.buffIndex); } if (dotDef.terminalTimedBuff != null) { victimBody.AddTimedBuff(dotDef.terminalTimedBuff, dotDef.terminalTimedBuffDuration); } } } private void RemoveDotStackAtServer(int i) { DotStack dotStack = dotStackList[i]; dotStackList.RemoveAt(i); OnDotStackRemovedServer(dotStack); dotStackPool.Return(dotStack); } private void EvaluateDotStacksForType(DotIndex dotIndex, float dt, out int remainingActive) { List list = CollectionPool>.RentCollection(); remainingActive = 0; DotDef dotDef = GetDotDef(dotIndex); for (int num = dotStackList.Count - 1; num >= 0; num--) { DotStack dotStack = dotStackList[num]; if (dotStack.dotIndex == dotIndex) { dotStack.timer -= dt; AddPendingDamageEntry(list, dotStack.attackerObject, dotStack.damage, dotStack.damageType); if (dotStack.timer <= 0f) { RemoveDotStackAtServer(num); } else { remainingActive++; } } } if ((bool)victimObject) { if ((bool)victimBody && dotIndex == DotIndex.Fracture && list.Count > 0) { if (FractureImpactEffectPrefab == null) { FractureImpactEffectPrefab = LegacyResourcesAPI.Load("Prefabs/Effects/FractureImpactEffect"); } EffectManager.SpawnEffect(FractureImpactEffectPrefab, new EffectData { origin = victimBody.corePosition }, transmit: true); } if ((bool)victimHealthComponent) { Vector3 corePosition = victimBody.corePosition; for (int i = 0; i < list.Count; i++) { DamageInfo damageInfo = new DamageInfo(); damageInfo.attacker = list[i].attackerObject; damageInfo.crit = false; damageInfo.damage = list[i].totalDamage; damageInfo.force = Vector3.zero; damageInfo.inflictor = base.gameObject; damageInfo.position = corePosition; damageInfo.procCoefficient = 0f; damageInfo.damageColorIndex = dotDef.damageColorIndex; damageInfo.damageType = list[i].damageType | DamageType.DoT; damageInfo.dotIndex = dotIndex; victimHealthComponent.TakeDamage(damageInfo); } } } for (int j = 0; j < list.Count; j++) { pendingDamagePool.Return(list[j]); } CollectionPool>.ReturnCollection(list); } [Server] private void AddDot(GameObject attackerObject, float duration, DotIndex dotIndex, float damageMultiplier, uint? maxStacksFromAttacker, float? totalDamage, DotIndex? preUpgradeDotIndex) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.DotController::AddDot(UnityEngine.GameObject,System.Single,RoR2.DotController/DotIndex,System.Single,System.Nullable`1,System.Nullable`1,System.Nullable`1)' called on client"); return; } TeamIndex attackerTeam = TeamIndex.Neutral; float num = 0f; TeamComponent component = attackerObject.GetComponent(); if ((bool)component) { attackerTeam = component.teamIndex; } CharacterBody component2 = attackerObject.GetComponent(); if ((bool)component2) { num = component2.damage; } DotDef dotDef = dotDefs[(int)dotIndex]; DotStack dotStack = dotStackPool.Request(); dotStack.dotIndex = dotIndex; dotStack.dotDef = dotDef; dotStack.attackerObject = attackerObject; dotStack.attackerTeam = attackerTeam; dotStack.timer = duration; dotStack.damage = dotDef.damageCoefficient * num * damageMultiplier; dotStack.damageType = DamageType.Generic; int num2 = 0; int i = 0; for (int count = dotStackList.Count; i < count; i++) { if (dotStackList[i].dotIndex == dotIndex) { num2++; } } switch (dotIndex) { case DotIndex.Bleed: case DotIndex.SuperBleed: case DotIndex.Fracture: case DotIndex.LunarRuin: { int k = 0; for (int count3 = dotStackList.Count; k < count3; k++) { if (dotStackList[k].dotIndex == dotIndex) { dotStackList[k].timer = Mathf.Max(dotStackList[k].timer, duration); } } break; } case DotIndex.Burn: case DotIndex.StrongerBurn: dotStack.damage = Mathf.Min(dotStack.damage, victimBody.healthComponent.fullCombinedHealth * 0.01f * damageMultiplier); break; case DotIndex.PercentBurn: dotStack.damage = Mathf.Min(dotStack.damage, victimBody.healthComponent.fullCombinedHealth * 0.01f); break; case DotIndex.Helfire: { if (!component2) { return; } HealthComponent healthComponent = component2.healthComponent; if (!healthComponent) { return; } dotStack.damage = Mathf.Min(healthComponent.fullCombinedHealth * 0.01f * damageMultiplier, victimBody.healthComponent.fullCombinedHealth * 0.01f * damageMultiplier); if ((bool)victimBody) { if (HelfireIgniteEffectPrefab == null) { HelfireIgniteEffectPrefab = LegacyResourcesAPI.Load("Prefabs/Effects/HelfireIgniteEffect"); } EffectManager.SpawnEffect(HelfireIgniteEffectPrefab, new EffectData { origin = victimBody.corePosition }, transmit: true); } break; } case DotIndex.Poison: { float a = victimHealthComponent.fullCombinedHealth / 100f * 1f * dotDef.interval; dotStack.damage = Mathf.Min(Mathf.Max(a, dotStack.damage), dotStack.damage * 50f); dotStack.damageType = DamageType.NonLethal; int j = 0; for (int count2 = dotStackList.Count; j < count2; j++) { if (dotStackList[j].dotIndex == DotIndex.Poison) { dotStackList[j].timer = Mathf.Max(dotStackList[j].timer, duration); dotStackList[j].damage = dotStack.damage; return; } } if (num2 == 0) { component2?.master?.playerStatsComponent?.currentStats.PushStatValue(StatDef.totalCrocoInfectionsInflicted, 1uL); } break; } } if ((dotIndex == DotIndex.Helfire || (preUpgradeDotIndex.HasValue && preUpgradeDotIndex.Value == DotIndex.Helfire)) && victimObject == attackerObject) { dotStack.damageType |= (DamageTypeCombo)(DamageType.NonLethal | DamageType.Silent); } dotStack.damage = Mathf.Max(1f, dotStack.damage); if (totalDamage.HasValue && dotStack.damage != 0f) { duration = totalDamage.Value * dotDef.interval / dotStack.damage; dotStack.timer = duration; } if (maxStacksFromAttacker.HasValue) { DotStack dotStack2 = null; int num3 = 0; int l = 0; for (int count4 = dotStackList.Count; l < count4; l++) { DotStack dotStack3 = dotStackList[l]; if (dotStack3.dotIndex == dotIndex && dotStack3.attackerObject == attackerObject) { num3++; if (dotStack2 == null || dotStack3.timer < dotStack2.timer) { dotStack2 = dotStack3; } } } if (num3 >= maxStacksFromAttacker.Value && dotStack2 != null) { if (dotStack2.timer < duration) { dotStack2.timer = duration; dotStack2.damage = dotStack.damage; dotStack2.damageType = dotStack.damageType; } return; } } if (num2 == 0 || dotDef.resetTimerOnAdd) { NetworkactiveDotFlags = activeDotFlags | (uint)(1 << (int)dotIndex); dotTimers[(int)dotIndex] = dotDef.interval; } dotStackList.Add(dotStack); OnDotStackAddedServer(dotStack); } [Server] public static void InflictDot(ref InflictDotInfo inflictDotInfo) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.DotController::InflictDot(RoR2.InflictDotInfo&)' called on client"); } else { if (inflictDotInfo.dotIndex < DotIndex.Bleed || inflictDotInfo.dotIndex >= DotIndex.Count || ImmuneToDebuffBehavior.OverrideDot(inflictDotInfo) || !inflictDotInfo.victimObject || !inflictDotInfo.attackerObject) { return; } if (!dotControllerLocator.TryGetValue(inflictDotInfo.victimObject.GetInstanceID(), out var value)) { if (DotControllerPrefab == null) { DotControllerPrefab = LegacyResourcesAPI.Load("Prefabs/NetworkedObjects/DotController"); } GameObject obj = UnityEngine.Object.Instantiate(DotControllerPrefab); value = obj.GetComponent(); value.victimObject = inflictDotInfo.victimObject; value.recordedVictimInstanceId = inflictDotInfo.victimObject.GetInstanceID(); dotControllerLocator.Add(value.recordedVictimInstanceId, value); NetworkServer.Spawn(obj); } value.AddDot(inflictDotInfo.attackerObject, inflictDotInfo.duration, inflictDotInfo.dotIndex, inflictDotInfo.damageMultiplier, inflictDotInfo.maxStacksFromAttacker, inflictDotInfo.totalDamage, inflictDotInfo.preUpgradeDotIndex); DotController.onDotInflictedServerGlobal?.Invoke(value, ref inflictDotInfo); } } [Server] public static void InflictDot(GameObject victimObject, GameObject attackerObject, DotIndex dotIndex, float duration = 8f, float damageMultiplier = 1f, uint? maxStacksFromAttacker = null) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.DotController::InflictDot(UnityEngine.GameObject,UnityEngine.GameObject,RoR2.DotController/DotIndex,System.Single,System.Single,System.Nullable`1)' called on client"); return; } InflictDotInfo inflictDotInfo = default(InflictDotInfo); inflictDotInfo.victimObject = victimObject; inflictDotInfo.attackerObject = attackerObject; inflictDotInfo.dotIndex = dotIndex; inflictDotInfo.duration = duration; inflictDotInfo.damageMultiplier = damageMultiplier; inflictDotInfo.maxStacksFromAttacker = maxStacksFromAttacker; InflictDotInfo inflictDotInfo2 = inflictDotInfo; InflictDot(ref inflictDotInfo2); } [Server] public static void RemoveAllDots(GameObject victimObject) { DotController value; if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'System.Void RoR2.DotController::RemoveAllDots(UnityEngine.GameObject)' called on client"); } else if (dotControllerLocator.TryGetValue(victimObject.GetInstanceID(), out value)) { value.HandleDestroy(); } } [Server] public static DotController FindDotController(GameObject victimObject) { if (!NetworkServer.active) { Debug.LogWarning("[Server] function 'RoR2.DotController RoR2.DotController::FindDotController(UnityEngine.GameObject)' called on client"); return null; } int i = 0; for (int count = instancesList.Count; i < count; i++) { if ((object)victimObject == instancesList[i]._victimObject) { return instancesList[i]; } } return null; } private void UNetVersion() { } public override bool OnSerialize(NetworkWriter writer, bool forceAll) { if (forceAll) { writer.Write(victimObjectId); writer.WritePackedUInt32(activeDotFlags); return true; } bool flag = false; if ((base.syncVarDirtyBits & (true ? 1u : 0u)) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.Write(victimObjectId); } if ((base.syncVarDirtyBits & 2u) != 0) { if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); flag = true; } writer.WritePackedUInt32(activeDotFlags); } if (!flag) { writer.WritePackedUInt32(base.syncVarDirtyBits); } return flag; } public override void OnDeserialize(NetworkReader reader, bool initialState) { if (initialState) { victimObjectId = reader.ReadNetworkId(); activeDotFlags = reader.ReadPackedUInt32(); return; } int num = (int)reader.ReadPackedUInt32(); if (((uint)num & (true ? 1u : 0u)) != 0) { victimObjectId = reader.ReadNetworkId(); } if (((uint)num & 2u) != 0) { activeDotFlags = reader.ReadPackedUInt32(); } } public override void PreStartClient() { } }