private bool EquipmentSlotOnExecuteIfReady(On.RoR2.EquipmentSlot.orig_ExecuteIfReady orig, EquipmentSlot self) { var origStock = self.stock; var executed = orig(self); if (executed && self.stock < origStock) { var tracker = self.characterBody.master.GetComponent <DurabilityTracker>(); if (tracker == null) { tracker = self.characterBody.masterObject.AddComponent <DurabilityTracker>(); } var durability = self.activeEquipmentSlot == 0 ? tracker.durability : tracker.durabilityAlt; var inv = self.characterBody.inventory; var equipDef = inv.currentEquipmentState.equipmentDef; var lifetime = equipDef.isLunar ? DurabilityConfig.LunarEquipLifetime.Value : DurabilityConfig.RegEquipLifetime.Value; var decay = 100 * equipDef.cooldown / lifetime; var fuelCells = inv.GetItemCount(ItemIndex.EquipmentMagazine); if (fuelCells > 0) { decay *= Mathf.Pow(0.85f, fuelCells); } durability -= decay; if (durability <= 0) { self.characterBody.inventory.SetEquipment(EquipmentState.empty, self.activeEquipmentSlot); durability = FullDurability; } if (self.activeEquipmentSlot == 0) { tracker.durability = durability; } else { tracker.durabilityAlt = durability; } var networkUser = self.characterBody.master?.playerCharacterMasterController?.networkUser; if (networkUser != null && !networkUser.isLocalPlayer) { var message = new UpdateDurabilityMessage { durability = tracker.durability, durabilityAlt = tracker.durabilityAlt }; _cmdUpdateDurability.Invoke(message, networkUser); } } return(executed); }
private void GenericPickupControllerOnGrantEquipment(On.RoR2.GenericPickupController.orig_GrantEquipment orig, GenericPickupController self, CharacterBody body, Inventory inventory) { if (NetworkServer.active) { var tracker = body.master.GetComponent <DurabilityTracker>(); if (tracker != null) { _nextDropDurability = inventory.activeEquipmentSlot == 0 ? tracker.durability : tracker.durabilityAlt; } else { _nextDropDurability = FullDurability; } } orig(self, body, inventory); if (NetworkServer.active) { float durability = FullDurability; var tracker = self.gameObject.GetComponent <DurabilityTracker>(); if (tracker != null) { durability = tracker.durability; tracker.durability = _nextDropDurability; _nextDropDurability = FullDurability; } var masterTracker = body.master.GetComponent <DurabilityTracker>(); if (masterTracker == null) { masterTracker = body.masterObject.AddComponent <DurabilityTracker>(); } if (inventory.activeEquipmentSlot == 0) { masterTracker.durability = durability; } else { masterTracker.durabilityAlt = durability; } var networkUser = body.master?.playerCharacterMasterController?.networkUser; if (networkUser != null && !networkUser.isLocalPlayer) { var message = new UpdateDurabilityMessage { durability = masterTracker.durability, durabilityAlt = masterTracker.durabilityAlt }; _cmdUpdateDurability.Invoke(message, networkUser); } } }
private void OnUpdateDurability(NetworkUser user, UpdateDurabilityMessage message) { var master = LocalUserManager.GetFirstLocalUser().cachedMasterObject; if (master != null) { var tracker = master.GetComponent <DurabilityTracker>(); if (tracker == null) { tracker = master.gameObject.AddComponent <DurabilityTracker>(); } tracker.durability = message.durability; tracker.durabilityAlt = message.durabilityAlt; } }