Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
                }
            }
        }
Esempio n. 3
0
        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;
            }
        }