public void OnReceived()
            {
                RoR2Application.fixedTimeTimers.CreateTimer(0.1f, () =>
                {
                    GameObject obj = Util.FindNetworkObject(objID);
                    if (obj)
                    {
                        var master = obj.GetComponent <CharacterMaster>();
                        if (!master)
                        {
                            return;
                        }
                        var body = master.GetBody();

                        var originalPickupDef = PickupCatalog.GetPickupDef(new PickupIndex(originalPickupIndex));
                        var originalItemDef   = ItemCatalog.GetItemDef((originalPickupDef != null) ? originalPickupDef.itemIndex : ItemIndex.None);
                        if (originalItemDef == null || originalItemDef.hidden)
                        {
                            return;
                        }

                        var convertedPickupDef = PickupCatalog.GetPickupDef(new PickupIndex(convertedPickupIndex));
                        var convertedItemDef   = ItemCatalog.GetItemDef((convertedPickupDef != null) ? convertedPickupDef.itemIndex : ItemIndex.None);
                        if (convertedItemDef == null || convertedItemDef.hidden)
                        {
                            return;
                        }

                        PlayerCharacterMasterController pcmc = master.GetComponent <PlayerCharacterMasterController>();
                        if (pcmc)
                        {
                            NetworkUser networkUser = pcmc.networkUser;
                            if (networkUser)
                            {
                                LocalUser localUser = networkUser.localUser;
                                if (localUser != null)
                                {
                                    localUser.userProfile.DiscoverPickup(new PickupIndex(convertedPickupIndex));
                                }
                            }
                        }

                        if (originalItemDef && !originalItemDef.hidden)
                        {
                            var notificationQueueHandler = CharacterMasterNotificationQueue.GetNotificationQueueForMaster(master);
                            if (notificationQueueHandler)
                            {
                                var info = new CharacterMasterNotificationQueue.NotificationInfo(ItemCatalog.GetItemDef(convertedItemDef.itemIndex));
                                if (notificationQueueHandler.notifications.Count <= 0 || notificationQueueHandler.notifications.Last().notification != info)
                                {
                                    notificationQueueHandler.notifications.Add(new CharacterMasterNotificationQueue.TimedNotificationInfo
                                    {
                                        notification = info,
                                        startTime    = Run.instance.fixedTime,
                                        duration     = 6f
                                    });
                                }
                            }
                        }

                        AddConversionMessage(
                            body,
                            ((originalPickupDef != null) ? originalPickupDef.nameToken : null) ?? PickupCatalog.invalidPickupToken,
                            (originalPickupDef != null) ? originalPickupDef.baseColor : Color.black,
                            originalPickupQuantity,
                            ((convertedPickupDef != null) ? convertedPickupDef.nameToken : null) ?? PickupCatalog.invalidPickupToken,
                            (convertedPickupDef != null) ? convertedPickupDef.baseColor : Color.black,
                            convertedPickupQuantity
                            );
                    }
                });
            }
        public override void OnLoad()
        {
            base.OnLoad();
            itemDef.name = "MysticsItems_LimitedArmor";
            SetItemTierWhenAvailable(ItemTier.Tier1);
            itemDef.tags = new ItemTag[]
            {
                ItemTag.Utility
            };
            itemDef.pickupModelPrefab = PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Bow/Model.prefab"));
            itemDef.pickupIconSprite  = Main.AssetBundle.LoadAsset <Sprite>("Assets/Items/Bow/Icon.png");

            itemDisplayPrefab = PrepareItemDisplayModel(PrepareModel(Main.AssetBundle.LoadAsset <GameObject>("Assets/Items/Bow/DisplayModel.prefab")));
            ChildLocatorAdditions.list.Add(new ChildLocatorAdditions.Addition
            {
                modelName         = "mdlTreebot",
                transformLocation = "TreebotArmature/ROOT/Base/PlatformBase/ArmPlatformBase/Antennae.1/Antennae.005/Antennae.003/Antennae.007/Antennae.002/Antennae.006/Antennae.004",
                childName         = "MIAntennae4"
            });
            onSetupIDRS += () =>
            {
                AddDisplayRule("CommandoBody", "Head", new Vector3(0.09206F, 0.33178F, -0.09136F), new Vector3(16.03024F, 63.62674F, 304.511F), new Vector3(0.02301F, 0.02301F, 0.02301F));
                AddDisplayRule("HuntressBody", "Head", new Vector3(0.01367F, 0.21655F, -0.17495F), new Vector3(357.0015F, 65.06252F, 277.7556F), new Vector3(0.02242F, 0.02242F, 0.02242F));
                AddDisplayRule("Bandit2Body", "Head", new Vector3(0.05274F, 0.09501F, -0.10753F), new Vector3(350.0532F, 63.19105F, 297.9137F), new Vector3(0.02805F, 0.02805F, 0.02805F));
                AddDisplayRule("ToolbotBody", "Head", new Vector3(-1.5345F, 1.70927F, 2.3488F), new Vector3(25.30116F, 73.93195F, 115.0976F), new Vector3(0.31308F, 0.31308F, 0.31308F));
                AddDisplayRule("EngiBody", "HeadCenter", new Vector3(0.05794F, 0.12538F, -0.14704F), new Vector3(0.49978F, 72.40844F, 310.3805F), new Vector3(0.03243F, 0.03243F, 0.03243F));
                AddDisplayRule("EngiTurretBody", "Head", new Vector3(-0.89207F, 0.72175F, -0.23478F), new Vector3(318.9225F, 103.5389F, 353.6144F), new Vector3(0.11999F, 0.11999F, 0.11999F));
                AddDisplayRule("EngiWalkerTurretBody", "Head", new Vector3(-0.73947F, 1.2767F, -0.80614F), new Vector3(324.2756F, 119.1527F, 340.6565F), new Vector3(0.10744F, 0.1307F, 0.10504F));
                AddDisplayRule("MageBody", "Head", new Vector3(0.06019F, 0.16738F, -0.14399F), new Vector3(343.2434F, 235.5832F, 58.464F), new Vector3(0.02055F, 0.02055F, 0.02055F));
                AddDisplayRule("MercBody", "Head", new Vector3(0.09912F, 0.20856F, -0.03218F), new Vector3(346.0291F, 221.2525F, 67.84089F), new Vector3(0.02243F, 0.02243F, 0.02243F));
                AddDisplayRule("TreebotBody", "MIAntennae4", new Vector3(-0.00461F, 0.14457F, 0.00345F), new Vector3(-0.00002F, 36.79062F, 272.2785F), new Vector3(0.0496F, 0.0496F, 0.0496F));
                AddDisplayRule("LoaderBody", "Head", new Vector3(0.07075F, 0.22212F, -0.05101F), new Vector3(16.6799F, 61.79085F, 306.0373F), new Vector3(0.02181F, 0.02181F, 0.02181F));
                AddDisplayRule("CrocoBody", "Head", new Vector3(1.45411F, 0.59183F, 1.08829F), new Vector3(56.441F, 150.6051F, 281.6682F), new Vector3(0.33415F, 0.59025F, 0.33415F));
                AddDisplayRule("CaptainBody", "Chest", new Vector3(0.00136F, 0.37981F, 0.1799F), new Vector3(350.816F, 280.0829F, 276.5578F), new Vector3(0.02509F, 0.02509F, 0.02509F));
                AddDisplayRule("BrotherBody", "Head", BrotherInfection.white, new Vector3(0.18348F, 0.10434F, 0.01567F), new Vector3(0F, 0F, 295.3276F), new Vector3(0.08227F, 0.04507F, 0.04507F));
                AddDisplayRule("ScavBody", "Chest", new Vector3(3.64754F, 6.52544F, -3.91259F), new Vector3(342.9161F, 287.3514F, 19.34576F), new Vector3(1.36506F, 1.40266F, 1.36506F));
                if (SoftDependencies.SoftDependenciesCore.itemDisplaysSniper)
                {
                    AddDisplayRule("SniperClassicBody", "Head", new Vector3(0.07554F, -0.03519F, -0.19979F), new Vector3(348.2051F, 48.22592F, 228.5832F), new Vector3(0.02543F, 0.02543F, 0.02543F));
                }
                AddDisplayRule("RailgunnerBody", "Head", new Vector3(0.05764F, 0.1407F, -0.13382F), new Vector3(355.0823F, 235.3653F, 70.07189F), new Vector3(0.01869F, 0.01869F, 0.01869F));
                AddDisplayRule("RailgunnerBody", "GunScope", new Vector3(-0.09378F, -0.17916F, 0.29156F), new Vector3(331.6838F, 257.2208F, 4.46473F), new Vector3(0.01869F, 0.01869F, 0.01869F));
                AddDisplayRule("VoidSurvivorBody", "Neck", new Vector3(-0.00094F, 0.24878F, -0.20333F), new Vector3(3.48902F, 270F, 270F), new Vector3(0.02107F, 0.02107F, 0.02107F));
            };

            On.RoR2.CharacterMaster.OnInventoryChanged += CharacterMaster_OnInventoryChanged;

            GenericGameEvents.BeforeTakeDamage += (damageInfo, attackerInfo, victimInfo) =>
            {
                if (victimInfo.inventory && victimInfo.master)
                {
                    int itemCount = victimInfo.inventory.GetItemCount(itemDef);
                    if (itemCount > 0)
                    {
                        MysticsItemsLimitedArmorBehavior component = victimInfo.master.gameObject.GetComponent <MysticsItemsLimitedArmorBehavior>();
                        if (!component)
                        {
                            component = victimInfo.master.gameObject.AddComponent <MysticsItemsLimitedArmorBehavior>();
                        }
                        if (component.HasAtLeastOneStock())
                        {
                            component.doDamageCheck++;
                        }
                    }
                }
            };
            GenericGameEvents.OnTakeDamage += (damageReport) =>
            {
                if (damageReport.victimMaster)
                {
                    MysticsItemsLimitedArmorBehavior component = damageReport.victimMaster.GetComponent <MysticsItemsLimitedArmorBehavior>();
                    if (component)
                    {
                        if (component.doDamageCheck > 0)
                        {
                            component.doDamageCheck--;
                            if (damageReport.damageInfo != null && !damageReport.damageInfo.rejected && damageReport.damageInfo.damage > 0)
                            {
                                var lostFinalHitInStock = component.RemoveStockAndCheck();
                                if (lostFinalHitInStock)
                                {
                                    Inventory inventory = damageReport.victimMaster.inventory;
                                    if (inventory)
                                    {
                                        component.skipItemCheck = true;
                                        inventory.RemoveItem(itemDef);
                                        component.skipItemCheck = false;
                                        inventory.GiveItem(MysticsItemsContent.Items.MysticsItems_LimitedArmorBroken);

                                        CharacterMasterNotificationQueue.PushItemTransformNotification(
                                            damageReport.victimMaster,
                                            MysticsItemsContent.Items.MysticsItems_LimitedArmor.itemIndex,
                                            MysticsItemsContent.Items.MysticsItems_LimitedArmorBroken.itemIndex,
                                            CharacterMasterNotificationQueue.TransformationType.Default
                                            );
                                        NetworkPickupDiscovery.DiscoverPickup(damageReport.victimMaster, LimitedArmorBroken.pickupIndex);
                                    }
                                }
                            }
                        }
                    }
                }
            };

            RecalculateStatsAPI.GetStatCoefficients += RecalculateStatsAPI_GetStatCoefficients;
        }
            public void FixedUpdate()
            {
                if (dirty && body.inventory)
                {
                    dirty = false;

                    itemLevel = 1;
                    if (body.level >= upgradeLevel12)
                    {
                        itemLevel = 2;
                    }
                    if (body.level >= upgradeLevel23)
                    {
                        itemLevel = 3;
                    }

                    var itemCount1 = body.inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_MarwanAsh1);
                    var itemCount2 = body.inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_MarwanAsh2);
                    var itemCount3 = body.inventory.GetItemCount(MysticsItemsContent.Items.MysticsItems_MarwanAsh3);

                    if (itemLevel == 2 && NetworkServer.active)
                    {
                        body.inventory.RemoveItem(MysticsItemsContent.Items.MysticsItems_MarwanAsh1, itemCount1);
                        body.inventory.GiveItem(MysticsItemsContent.Items.MysticsItems_MarwanAsh2, itemCount1);

                        if (itemCount1 > 0)
                        {
                            CharacterMasterNotificationQueue.PushItemTransformNotification(
                                body.master,
                                MysticsItemsContent.Items.MysticsItems_MarwanAsh1.itemIndex,
                                MysticsItemsContent.Items.MysticsItems_MarwanAsh2.itemIndex,
                                CharacterMasterNotificationQueue.TransformationType.Default
                                );
                            NetworkPickupDiscovery.DiscoverPickup(body.master, level2PickupIndex);
                        }

                        itemCount2 += itemCount1;
                        itemCount1  = 0;
                    }
                    if (itemLevel == 3 && NetworkServer.active)
                    {
                        body.inventory.RemoveItem(MysticsItemsContent.Items.MysticsItems_MarwanAsh1, itemCount1);
                        body.inventory.RemoveItem(MysticsItemsContent.Items.MysticsItems_MarwanAsh2, itemCount2);
                        body.inventory.GiveItem(MysticsItemsContent.Items.MysticsItems_MarwanAsh3, itemCount1 + itemCount2);

                        if (itemCount1 > 0)
                        {
                            CharacterMasterNotificationQueue.PushItemTransformNotification(
                                body.master,
                                MysticsItemsContent.Items.MysticsItems_MarwanAsh1.itemIndex,
                                MysticsItemsContent.Items.MysticsItems_MarwanAsh3.itemIndex,
                                CharacterMasterNotificationQueue.TransformationType.Default
                                );
                            NetworkPickupDiscovery.DiscoverPickup(body.master, level2PickupIndex);
                        }
                        if (itemCount2 > 0)
                        {
                            CharacterMasterNotificationQueue.PushItemTransformNotification(
                                body.master,
                                MysticsItemsContent.Items.MysticsItems_MarwanAsh2.itemIndex,
                                MysticsItemsContent.Items.MysticsItems_MarwanAsh3.itemIndex,
                                CharacterMasterNotificationQueue.TransformationType.Default
                                );
                            NetworkPickupDiscovery.DiscoverPickup(body.master, level3PickupIndex);
                        }

                        itemCount3 += itemCount1 + itemCount2;
                        itemCount1  = 0;
                        itemCount2  = 0;
                    }
                    itemCount = itemCount1 + itemCount2 + itemCount3;
                }
            }