Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of Dronemeld v1.3.2
Dronemeld.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using EntityStates; using EntityStates.Drone; using IL.RoR2; using Mono.Cecil; using Mono.Cecil.Cil; using MonoMod.Cil; using On.EntityStates.Drone; using On.RoR2; using On.RoR2.Projectile; using On.RoR2.Skills; using R2API; using R2API.Networking; using R2API.Networking.Interfaces; using R2API.Utils; using RoR2; using RoR2.Projectile; using RoR2.Skills; using TILER2; using UnityEngine; using UnityEngine.Networking; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = "")] [assembly: AssemblyCompany("Dronemeld")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0")] [assembly: AssemblyProduct("Dronemeld")] [assembly: AssemblyTitle("Dronemeld")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.0.0")] [module: UnverifiableCode] namespace ThinkInvisible.Dronemeld; [BepInPlugin("com.ThinkInvisible.Dronemeld", "Dronemeld", "1.3.2")] [BepInDependency("com.bepis.r2api", "5.1.1")] [BepInDependency("com.ThinkInvisible.TILER2", "7.4.2")] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] public class DronemeldPlugin : BaseUnityPlugin { public enum DronemeldPriorityOrder { RoundRobin, Random, FirstOnly } public class ServerConfig : AutoConfigContainer { [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOCheckbox(null, null)] public bool perPlayer { get; internal set; } = true; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOIntSlider("{0:N0}", 1, 10, null, null)] public int maxDronesPerType { get; internal set; } = 1; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOChoice(null, null)] public DronemeldPriorityOrder priorityOrder { get; internal set; } [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOSlider("+{0:N2}x", 0f, 2f, null, null)] public float statMultHealth { get; internal set; } = 1f; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOSlider("+{0:N2}x", 0f, 2f, null, null)] public float statMultDamage { get; internal set; } = 0.6f; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOSlider("+{0:N2}x", 0f, 2f, null, null)] public float statMultAttackSpeed { get; internal set; } = 0.6f; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOSlider("+{0:N2}x", 0f, 2f, null, null)] public float statMultCDR { get; internal set; } = 0.6f; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOCheckbox(null, null)] public bool quantumTurrets { get; internal set; } = true; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOString(null, null)] public string masterWhitelist { get; internal set; } = "Drone1Master, Drone2Master, DroneMissileMaster, FlameDroneMaster, MegaDroneMaster, Turret1Master, DroneBackupMaster, BeetleGuardAllyMaster, VoidMegaCrabAllyMaster, VoidJailerAllyMaster, NullifierAllyMaster, MinorConstructOnKillMaster, SquidTurretMaster"; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOCheckbox(null, null)] public bool applyToGoobo { get; internal set; } = true; [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOString(null, null)] public string quantumWhitelist { get; internal set; } = "Turret1Master, MinorConstructOnKillMaster, SquidTurretMaster"; } public class ClientConfig : AutoConfigContainer { [AutoConfig(/*Could not decode attribute arguments.*/)] [AutoConfigRoOSlider("{0:P0}", 0f, 1f, null, null)] public float vfxResize { get; internal set; } = 0.25f; } public struct MsgAddDroneSize : INetMessage, ISerializableObject { private GameObject _target; public MsgAddDroneSize(GameObject target) { _target = target; } public void Serialize(NetworkWriter writer) { writer.Write(_target); } public void Deserialize(NetworkReader reader) { _target = reader.ReadGameObject(); } public void OnReceived() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)_target) && clientConfig.vfxResize != 0f) { CharacterBody component = _target.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.modelLocator)) { Transform modelTransform = component.modelLocator.modelTransform; modelTransform.localScale += Vector3.one * clientConfig.vfxResize; } } } } public struct MsgRemoveDroneSize : INetMessage, ISerializableObject { private GameObject _target; public MsgRemoveDroneSize(GameObject target) { _target = target; } public void Serialize(NetworkWriter writer) { writer.Write(_target); } public void Deserialize(NetworkReader reader) { _target = reader.ReadGameObject(); } public void OnReceived() { //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)_target) && clientConfig.vfxResize != 0f) { CharacterBody component = _target.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.modelLocator)) { Transform modelTransform = component.modelLocator.modelTransform; modelTransform.localScale -= Vector3.one * clientConfig.vfxResize; } } } } [RequireComponent(typeof(CharacterMaster))] public class DronemeldQuantumTurret : MonoBehaviour { private readonly List<Vector3> storedStates = new List<Vector3>(); private CharacterMaster master; private const float EPSILON = 5f; public void RegisterLocation(Vector3 pos) { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) GameObject bodyObject = master.GetBodyObject(); if (Object.op_Implicit((Object)(object)bodyObject) && !(Vector3.Distance(bodyObject.transform.position, pos) < 5f)) { storedStates.Add(pos); } } private void Awake() { master = ((Component)this).GetComponent<CharacterMaster>(); Stage.onServerStageComplete += Stage_onServerStageComplete; } private void Stage_onServerStageComplete(Stage obj) { storedStates.Clear(); } private void FixedUpdate() { //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e3: Unknown result type (might be due to invalid IL or missing references) if (!NetworkServer.active || storedStates.Count < 1) { return; } CharacterMaster ownerMaster = master.minionOwnership.ownerMaster; if (!Object.op_Implicit((Object)(object)ownerMaster)) { return; } GameObject ownerObj = ownerMaster.GetBodyObject(); if (!Object.op_Implicit((Object)(object)ownerObj)) { return; } GameObject bodyObject = master.GetBodyObject(); if (Object.op_Implicit((Object)(object)bodyObject)) { float num = Vector3.Distance(ownerObj.transform.position, bodyObject.transform.position); Vector3 val = storedStates.OrderBy((Vector3 state) => Vector3.Distance(ownerObj.transform.position, state)).First(); if (Vector3.Distance(ownerObj.transform.position, val) < num) { storedStates.Remove(val); storedStates.Add(bodyObject.transform.position); TeleportHelper.TeleportGameObject(bodyObject, val); } } } } [RequireComponent(typeof(CharacterMaster))] public class TimedDronemeldStack : MonoBehaviour { private float stopwatch; private bool started; private CharacterMaster boundCM; public void Activate(float time) { if (!started) { boundCM.inventory.GiveItem(stackItem, 1); CharacterBody body = boundCM.GetBody(); if (Object.op_Implicit((Object)(object)body)) { NetMessageExtensions.Send((INetMessage)(object)new MsgAddDroneSize(((Component)body).gameObject), (NetworkDestination)1); } stopwatch = time; started = true; } } private void Awake() { boundCM = ((Component)this).GetComponent<CharacterMaster>(); } private void FixedUpdate() { if (!started) { return; } stopwatch -= Time.fixedDeltaTime; if (stopwatch <= 0f) { boundCM.inventory.RemoveItem(stackItem, 1); CharacterBody body = boundCM.GetBody(); if (Object.op_Implicit((Object)(object)body)) { NetMessageExtensions.Send((INetMessage)(object)new MsgRemoveDroneSize(((Component)body).gameObject), (NetworkDestination)1); } Object.Destroy((Object)(object)this); } } } public const string ModVer = "1.3.2"; public const string ModName = "Dronemeld"; public const string ModGuid = "com.ThinkInvisible.Dronemeld"; private static ConfigFile cfgFile; internal static ManualLogSource _logger; public static ServerConfig serverConfig = new ServerConfig(); public static ClientConfig clientConfig = new ClientConfig(); private static readonly HashSet<string> _masterWhitelist = new HashSet<string>(); private static Xoroshiro128Plus rng; public static ItemDef stackItem; private void Awake() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Expected O, but got Unknown //IL_0122: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Expected O, but got Unknown //IL_0133: Unknown result type (might be due to invalid IL or missing references) //IL_013d: Expected O, but got Unknown //IL_0144: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Expected O, but got Unknown //IL_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015f: Expected O, but got Unknown //IL_0166: Unknown result type (might be due to invalid IL or missing references) //IL_0170: Expected O, but got Unknown //IL_0177: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Expected O, but got Unknown //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Expected O, but got Unknown //IL_0199: Unknown result type (might be due to invalid IL or missing references) //IL_01a3: Expected O, but got Unknown //IL_01aa: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Expected O, but got Unknown //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c5: Expected O, but got Unknown _logger = ((BaseUnityPlugin)this).Logger; cfgFile = new ConfigFile(Path.Combine(Paths.ConfigPath, "com.ThinkInvisible.Dronemeld.cfg"), true); ((AutoConfigContainer)serverConfig).ConfigEntryChanged += delegate(object sender, AutoConfigUpdateActionEventArgs args) { if (args.target.boundProperty.Name == "masterWhitelist") { UpdateMasterWhitelist(); } }; ((AutoConfigContainer)serverConfig).BindAll(cfgFile, "Dronemeld", "Server"); ((AutoConfigContainer)clientConfig).BindAll(cfgFile, "Dronemeld", "Client"); UpdateMasterWhitelist(); stackItem = ScriptableObject.CreateInstance<ItemDef>(); stackItem.deprecatedTier = (ItemTier)5; stackItem.canRemove = false; stackItem.hidden = true; stackItem.nameToken = "ITEM_DRONEMELD_STACK_NAME"; stackItem.loreToken = ""; stackItem.descriptionToken = ""; stackItem.pickupToken = ""; ((Object)stackItem).name = "DronemeldInternalStackItem"; stackItem.tags = (ItemTag[])(object)new ItemTag[0]; ContentAddition.AddItemDef(stackItem); NetworkingAPI.RegisterMessageType<MsgAddDroneSize>(); Run.Start += new hook_Start(Run_Start); SkillDef.OnFixedUpdate += new hook_OnFixedUpdate(SkillDef_OnFixedUpdate); RecalculateStatsAPI.GetStatCoefficients += new StatHookEventHandler(RecalculateStatsAPI_GetStatCoefficients); CharacterBody.GetDisplayName += new hook_GetDisplayName(CharacterBody_GetDisplayName); CharacterMaster.OnBodyStart += new hook_OnBodyStart(CharacterMaster_OnBodyStart); DeathState.OnImpactServer += new hook_OnImpactServer(DeathState_OnImpactServer); MasterSummon.Perform += new hook_Perform(MasterSummon_Perform); GummyCloneProjectile.SpawnGummyClone += new hook_SpawnGummyClone(GummyCloneProjectile_SpawnGummyClone); DirectorCore.TrySpawnObject += new hook_TrySpawnObject(DirectorCore_TrySpawnObject); CharacterMaster.GetDeployableCount += new Manipulator(CharacterMaster_GetDeployableCount); CharacterBody.RecalculateStats += new Manipulator(CharacterBody_RecalculateStats); } private void UpdateMasterWhitelist() { _masterWhitelist.Clear(); _masterWhitelist.UnionWith(from x in serverConfig.masterWhitelist.Split(',') select x.Trim()); } public static bool IsDronemeldEnabledFor(string masterPrefabName) { return _masterWhitelist.Contains(masterPrefabName); } public static CharacterMaster TryApply(CharacterMaster ownerMaster, string targetPrefabName) { if (!IsDronemeldEnabledFor(targetPrefabName)) { return null; } return TryApply(CharacterMaster.readOnlyInstancesList.Where((CharacterMaster m) => (serverConfig.perPlayer ? ((Object)(object)m.minionOwnership.ownerMaster == (Object)(object)ownerMaster) : (m.teamIndex == ownerMaster.teamIndex)) && ((Object)((Component)m).gameObject).name.Replace("(Clone)", "") == targetPrefabName)); } public static CharacterMaster TryApply(IEnumerable<CharacterMaster> targetMasters) { if (targetMasters.Count() >= serverConfig.maxDronesPerType) { CharacterMaster val = (CharacterMaster)(serverConfig.priorityOrder switch { DronemeldPriorityOrder.Random => rng.NextElementUniform<CharacterMaster>(targetMasters.ToArray()), DronemeldPriorityOrder.FirstOnly => targetMasters.First(), DronemeldPriorityOrder.RoundRobin => targetMasters.OrderBy((CharacterMaster d) => d.inventory.GetItemCount(stackItem)).First(), _ => throw new InvalidOperationException("Encountered invalid value of serverConfig.priorityOrder."), }); MasterSuicideOnTimer val2 = default(MasterSuicideOnTimer); if (((Component)val).TryGetComponent<MasterSuicideOnTimer>(ref val2)) { ((Component)val).gameObject.AddComponent<TimedDronemeldStack>().Activate(val2.lifeTimer - val2.timer); val2.timer = 0f; } else { val.inventory.GiveItem(stackItem, 1); CharacterBody body = val.GetBody(); if (Object.op_Implicit((Object)(object)body)) { NetMessageExtensions.Send((INetMessage)(object)new MsgAddDroneSize(((Component)body).gameObject), (NetworkDestination)1); } } return val; } return null; } private void Run_Start(orig_Start orig, Run self) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Expected O, but got Unknown orig.Invoke(self); if (NetworkServer.active) { rng = new Xoroshiro128Plus(self.seed); } } private CharacterMaster MasterSummon_Perform(orig_Perform orig, MasterSummon self) { //IL_00ad: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = default(CharacterBody); if (Object.op_Implicit((Object)(object)self.masterPrefab) && Object.op_Implicit((Object)(object)self.summonerBodyObject) && self.summonerBodyObject.TryGetComponent<CharacterBody>(ref val) && Object.op_Implicit((Object)(object)val.master)) { CharacterMaster val2 = TryApply(val.master, ((Object)self.masterPrefab).name); if (Object.op_Implicit((Object)(object)val2)) { if (serverConfig.quantumWhitelist.Contains(((Object)((Component)val2).gameObject).name.Replace("(Clone)", ""))) { DronemeldQuantumTurret dronemeldQuantumTurret = ((Component)val2).gameObject.AddComponent<DronemeldQuantumTurret>(); if (!Object.op_Implicit((Object)(object)dronemeldQuantumTurret)) { ((Component)val2).gameObject.AddComponent<DronemeldQuantumTurret>(); } else { dronemeldQuantumTurret.RegisterLocation(self.position); } } return null; } } return orig.Invoke(self); } private GameObject DirectorCore_TrySpawnObject(orig_TrySpawnObject orig, DirectorCore self, DirectorSpawnRequest directorSpawnRequest) { //IL_00be: Unknown result type (might be due to invalid IL or missing references) CharacterBody val = default(CharacterBody); if (Object.op_Implicit((Object)(object)directorSpawnRequest.summonerBodyObject) && directorSpawnRequest.summonerBodyObject.TryGetComponent<CharacterBody>(ref val) && Object.op_Implicit((Object)(object)val.master)) { CharacterMaster val2 = TryApply(val.master, ((Object)directorSpawnRequest.spawnCard.prefab).name); if (Object.op_Implicit((Object)(object)val2)) { if (serverConfig.quantumWhitelist.Contains(((Object)((Component)val2).gameObject).name.Replace("(Clone)", ""))) { DronemeldQuantumTurret dronemeldQuantumTurret = ((Component)val2).gameObject.AddComponent<DronemeldQuantumTurret>(); if (!Object.op_Implicit((Object)(object)dronemeldQuantumTurret)) { ((Component)val2).gameObject.AddComponent<DronemeldQuantumTurret>(); } else { GameObject val3 = orig.Invoke(self, directorSpawnRequest); if (Object.op_Implicit((Object)(object)val3)) { dronemeldQuantumTurret.RegisterLocation(val3.transform.position); val3.GetComponent<CharacterMaster>().TrueKill(); val2.inventory.RemoveItem(stackItem, 1); } } } return null; } } return orig.Invoke(self, directorSpawnRequest); } private void CharacterMaster_GetDeployableCount(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown //IL_0047: Unknown result type (might be due to invalid IL or missing references) ILCursor val = new ILCursor(il); if (val.TryGotoNext((MoveType)0, new Func<Instruction, bool>[1] { (Instruction i) => ILPatternMatchingExt.MatchLdfld<DeployableInfo>(i, "slot") })) { DeployableInfo capturedDI = default(DeployableInfo); val.EmitDelegate<Func<DeployableInfo, DeployableInfo>>((Func<DeployableInfo, DeployableInfo>)delegate(DeployableInfo di) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Unknown result type (might be due to invalid IL or missing references) capturedDI = di; return di; }); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[4] { (Instruction i) => ILPatternMatchingExt.MatchLdloc(i, 0), (Instruction i) => ILPatternMatchingExt.MatchLdcI4(i, 1), (Instruction i) => ILPatternMatchingExt.MatchAdd(i), (Instruction i) => ILPatternMatchingExt.MatchStloc(i, 0) })) { int index = val.Index; val.Index = index - 1; Inventory val2 = default(Inventory); val.EmitDelegate<Func<int, int>>((Func<int, int>)((int addend) => (Object.op_Implicit((Object)(object)capturedDI.deployable) && ((Component)capturedDI.deployable).TryGetComponent<Inventory>(ref val2)) ? (val2.GetItemCount(stackItem) + addend) : addend)); } else { _logger.LogError((object)"Failed to apply IL patch: CharacterMaster_GetDeployableCount, part 2. Dronemeld will fail to work or have unexpected results on certain spawn methods."); } } else { _logger.LogError((object)"Failed to apply IL patch: CharacterMaster_GetDeployableCount, part 1. Dronemeld will fail to work or have unexpected results on certain spawn methods."); } } private void CharacterBody_RecalculateStats(ILContext il) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0007: Expected O, but got Unknown ILCursor val = new ILCursor(il); MethodReference val3 = default(MethodReference); if (val.TryGotoNext((MoveType)2, new Func<Instruction, bool>[2] { (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt<TeamComponent>(i, "GetTeamMembers"), (Instruction i) => ILPatternMatchingExt.MatchCallOrCallvirt(i, ref val3) })) { int index = val.Index; val.Index = index - 1; val.Remove(); CharacterBody val2 = default(CharacterBody); val.EmitDelegate<Func<ReadOnlyCollection<TeamComponent>, int>>((Func<ReadOnlyCollection<TeamComponent>, int>)((ReadOnlyCollection<TeamComponent> members) => members.Sum((TeamComponent m) => (!((Component)m).TryGetComponent<CharacterBody>(ref val2) || !Object.op_Implicit((Object)(object)val2.inventory)) ? 1 : (1 + val2.inventory.GetItemCount(stackItem))))); } else { _logger.LogError((object)"Failed to apply IL patch: CharacterBody_RecalculateStats. Empathy Cores will not count Dronemeld stacks for their per-ally stat boost."); } } private void GummyCloneProjectile_SpawnGummyClone(orig_SpawnGummyClone orig, GummyCloneProjectile self) { ProjectileController val = default(ProjectileController); CharacterBody ob = default(CharacterBody); if (!serverConfig.applyToGoobo || !((Component)self).TryGetComponent<ProjectileController>(ref val) || !Object.op_Implicit((Object)(object)val.owner) || !val.owner.TryGetComponent<CharacterBody>(ref ob) || !Object.op_Implicit((Object)(object)ob.master) || !Object.op_Implicit((Object)(object)TryApply(CharacterMaster.readOnlyInstancesList.Where((CharacterMaster m) => (serverConfig.perPlayer ? ((Object)(object)m.minionOwnership.ownerMaster == (Object)(object)ob.master) : (m.teamIndex == ob.master.teamIndex)) && m.inventory.GetItemCount(Items.GummyCloneIdentifier) > 0)))) { orig.Invoke(self); } } private void CharacterMaster_OnBodyStart(orig_OnBodyStart orig, CharacterMaster self, CharacterBody body) { //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0080: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, body); if (Object.op_Implicit((Object)(object)self.inventory) && Object.op_Implicit((Object)(object)body.modelLocator) && Object.op_Implicit((Object)(object)body.modelLocator.modelTransform)) { int itemCount = self.inventory.GetItemCount(stackItem); if (NetworkClient.active && Object.op_Implicit((Object)(object)body.modelLocator) && clientConfig.vfxResize > 0f && itemCount > 0) { Transform modelTransform = body.modelLocator.modelTransform; modelTransform.localScale += Vector3.one * clientConfig.vfxResize * (float)itemCount; } } } private void RecalculateStatsAPI_GetStatCoefficients(CharacterBody sender, StatHookEventArgs args) { if (Object.op_Implicit((Object)(object)sender) && Object.op_Implicit((Object)(object)sender.master)) { int itemCount = sender.master.inventory.GetItemCount(stackItem); if (itemCount > 0) { args.baseHealthAdd += (sender.baseMaxHealth + sender.levelMaxHealth * sender.level) * (float)itemCount * serverConfig.statMultHealth; args.baseDamageAdd += (sender.baseDamage + sender.levelDamage * sender.level) * (float)itemCount * serverConfig.statMultDamage; args.baseAttackSpeedAdd += (sender.baseAttackSpeed + sender.levelAttackSpeed * sender.level) * (float)itemCount * serverConfig.statMultAttackSpeed; } } } private void SkillDef_OnFixedUpdate(orig_OnFixedUpdate orig, SkillDef self, GenericSkill skillSlot, float deltaTime) { if (Object.op_Implicit((Object)(object)skillSlot) && Object.op_Implicit((Object)(object)skillSlot.characterBody) && Object.op_Implicit((Object)(object)skillSlot.characterBody.master)) { int itemCount = skillSlot.characterBody.master.inventory.GetItemCount(stackItem); if (itemCount > 0) { skillSlot.RunRecharge(deltaTime * (float)itemCount * serverConfig.statMultCDR); } } orig.Invoke(self, skillSlot, deltaTime); } private void DeathState_OnImpactServer(orig_OnImpactServer orig, DeathState self, Vector3 contactPoint) { //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) int num = 0; if (Object.op_Implicit((Object)(object)((EntityState)self).characterBody) && Object.op_Implicit((Object)(object)((EntityState)self).characterBody.master) && Object.op_Implicit((Object)(object)((EntityState)self).characterBody.master.inventory)) { num = ((EntityState)self).characterBody.master.inventory.GetItemCount(stackItem); } orig.Invoke(self, contactPoint); for (int i = 0; i < num; i++) { orig.Invoke(self, contactPoint); } } private string CharacterBody_GetDisplayName(orig_GetDisplayName orig, CharacterBody self) { string text = orig.Invoke(self); if (Object.op_Implicit((Object)(object)self) && Object.op_Implicit((Object)(object)self.master)) { int itemCount = self.master.inventory.GetItemCount(stackItem); if (itemCount > 0) { return $"{text} <style=cStack>x{itemCount + 1}</style>"; } } return text; } }