using Audio; using static RebirthVariables; using static vp_Timer; internal class XUiC_RandomItemRebirth : XUiController { private static float uiCheck = 1f; public float uiTick = 0.5f; public float barterPerc = 0f; public float durabilityThreshold = 0.5f; public float multiplierCash = 3f; public float multiplierBlueprint = 1.5f; public float tierMultiplier = 0.35f; public float barterPercUnit = 0.04f; public bool cannotTrade = false; public ItemValue currentItem = null; public XUiV_Label LabelTotal; private XUiC_ComboBoxList cbxRandomWeapon; public XUiV_Label LabelDescription; public XUiV_Panel Panel; public XUiV_Label lblNameLabel; public XUiV_Label lblName; public XUiV_Label lblEntityDamageLabel; public XUiV_Label lblEntityDamage; public XUiV_Label lblBlockDamageLabel; public XUiV_Label lblBlockDamage; public XUiV_Label lblRoundsPerMinuteLabel; public XUiV_Label lblRoundsPerMinute; public XUiV_Label lblAttacksPerMinuteLabel; public XUiV_Label lblAttacksPerMinute; public XUiV_Label lblDamageFalloffRangeLabel; public XUiV_Label lblDamageFalloffRange; public XUiV_Label lblStaminaLossLabel; public XUiV_Label lblStaminaLoss; public XUiV_Label lblMagazineSizeLabel; public XUiV_Label lblMagazineSize; public XUiV_Label lblDegradationMaxLabel; public XUiV_Label lblDegradationMax; public XUiV_Label lblModSlotsLabel; public XUiV_Label lblModSlots; public XUiV_Label lblBonusLabel; public XUiV_Label lblBonus; public XUiV_Label lblTotalCash; public XUiV_Label lblTotalBlueprints; public XUiV_Label lblPurchaseCost; public XUiV_Label lblRefreshCost; public XUiV_Label lblRefreshTime; public XUiV_Sprite spriteItemImage; public XUiV_Sprite spriteBonusTypeIcon; public XUiV_Sprite cashImage; public XUiV_Sprite blueprintImage; public XUiV_Sprite refreshImage; public override void Init() { base.Init(); Panel = (XUiV_Panel)GetChildById("Popup").ViewComponent; ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnPurchase")).OnPressed += BtnPurchase_OnPressed; ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnRefresh")).OnPressed += BtnRefresh_OnPressed; ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnCancel")).OnPressed += BtnCancel_OnPressed; LabelDescription = (XUiV_Label)Panel.Controller.GetChildById("lblDescription").ViewComponent; lblNameLabel = (XUiV_Label)Panel.Controller.GetChildById("lblNameLabel").ViewComponent; lblName = (XUiV_Label)Panel.Controller.GetChildById("lblName").ViewComponent; lblEntityDamageLabel = (XUiV_Label)Panel.Controller.GetChildById("lblEntityDamageLabel").ViewComponent; lblEntityDamage = (XUiV_Label)Panel.Controller.GetChildById("lblEntityDamage").ViewComponent; lblBlockDamageLabel = (XUiV_Label)Panel.Controller.GetChildById("lblBlockDamageLabel").ViewComponent; lblBlockDamage = (XUiV_Label)Panel.Controller.GetChildById("lblBlockDamage").ViewComponent; lblRoundsPerMinuteLabel = (XUiV_Label)Panel.Controller.GetChildById("lblRoundsPerMinuteLabel").ViewComponent; lblRoundsPerMinute = (XUiV_Label)Panel.Controller.GetChildById("lblRoundsPerMinute").ViewComponent; lblAttacksPerMinuteLabel = (XUiV_Label)Panel.Controller.GetChildById("lblAttacksPerMinuteLabel").ViewComponent; lblAttacksPerMinute = (XUiV_Label)Panel.Controller.GetChildById("lblAttacksPerMinute").ViewComponent; lblDamageFalloffRangeLabel = (XUiV_Label)Panel.Controller.GetChildById("lblDamageFalloffRangeLabel").ViewComponent; lblDamageFalloffRange = (XUiV_Label)Panel.Controller.GetChildById("lblDamageFalloffRange").ViewComponent; lblStaminaLossLabel = (XUiV_Label)Panel.Controller.GetChildById("lblStaminaLossLabel").ViewComponent; lblStaminaLoss = (XUiV_Label)Panel.Controller.GetChildById("lblStaminaLoss").ViewComponent; lblMagazineSizeLabel = (XUiV_Label)Panel.Controller.GetChildById("lblMagazineSizeLabel").ViewComponent; lblMagazineSize = (XUiV_Label)Panel.Controller.GetChildById("lblMagazineSize").ViewComponent; lblDegradationMaxLabel = (XUiV_Label)Panel.Controller.GetChildById("lblDegradationMaxLabel").ViewComponent; lblDegradationMax = (XUiV_Label)Panel.Controller.GetChildById("lblDegradationMax").ViewComponent; lblModSlotsLabel = (XUiV_Label)Panel.Controller.GetChildById("lblModSlotsLabel").ViewComponent; lblModSlots = (XUiV_Label)Panel.Controller.GetChildById("lblModSlots").ViewComponent; lblBonusLabel = (XUiV_Label)Panel.Controller.GetChildById("lblBonusLabel").ViewComponent; lblBonus = (XUiV_Label)Panel.Controller.GetChildById("lblBonus").ViewComponent; lblTotalCash = (XUiV_Label)Panel.Controller.GetChildById("lblTotalCash").ViewComponent; lblTotalBlueprints = (XUiV_Label)Panel.Controller.GetChildById("lblTotalBlueprints").ViewComponent; lblPurchaseCost = (XUiV_Label)Panel.Controller.GetChildById("lblPurchaseCost").ViewComponent; lblRefreshCost = (XUiV_Label)Panel.Controller.GetChildById("lblRefreshCost").ViewComponent; lblRefreshTime = (XUiV_Label)Panel.Controller.GetChildById("lblRefreshTime").ViewComponent; spriteItemImage = (XUiV_Sprite)GetChildById("itemImage").ViewComponent; spriteBonusTypeIcon = (XUiV_Sprite)GetChildById("bonusTypeIcon").ViewComponent; cashImage = (XUiV_Sprite)GetChildById("CashImage").ViewComponent; blueprintImage = (XUiV_Sprite)GetChildById("BlueprintImage").ViewComponent; refreshImage = (XUiV_Sprite)GetChildById("RefreshImage").ViewComponent; this.cbxRandomWeapon = (base.GetChildById("cbxItem") as XUiC_ComboBoxList); if (this.cbxRandomWeapon != null) { this.cbxRandomWeapon.OnValueChanged += this.cbxRandomWeapon_OnValueChanged; } } public override void Update(float _dt) { base.Update(_dt); if ((Time.time - uiCheck) > uiTick) { uiCheck = Time.time; lblRefreshTime.Text = Localization.Get("xuiExpiresIn") + ": [c98181]" + RebirthUtilities.GetTimeRemainingMS(RebirthVariables.randomWeaponUpdateTick, RebirthVariables.randomWeaponUpdateCheck) + "[-]"; lblRefreshTime.isDirty = true; if (RebirthVariables.refreshRandomWeapons) { RebirthVariables.refreshRandomWeapons = false; Reset(); updateItem(); } } } private void cbxRandomWeapon_OnValueChanged(XUiController _sender, string _oldValue, string _newValue) { updateItem(); } private void updateItem() { EntityPlayer player = xui.playerUI.entityPlayer; int questTier = player.QuestJournal.GetCurrentFactionTier((byte)1); string purchaseCost = Localization.Get("xuiPurchaseItemExchange"); currentItem = null; if (RebirthVariables.randomWeapons.Count > 0) { //Log.Out("XUiC_RandomItemRebirth-OnOpen cbxRandomWeapon.SelectedIndex:" + cbxRandomWeapon.SelectedIndex); RandomWeapon randomWeapon = RebirthVariables.randomWeapons[cbxRandomWeapon.SelectedIndex]; if (randomWeapon.Weapon != null) { ItemValue itemValue = randomWeapon.Weapon; currentItem = itemValue; int entityDamage = (int)EffectManager.GetValue(PassiveEffects.EntityDamage, itemValue); int blockDamage = (int)EffectManager.GetValue(PassiveEffects.BlockDamage, itemValue); int staminaLoss = (int)EffectManager.GetValue(PassiveEffects.StaminaLoss, itemValue); if (randomWeapon.Type == WeaponType.Melee) { // MELEE lblRoundsPerMinuteLabel.IsVisible = false; lblRoundsPerMinute.IsVisible = false; lblDamageFalloffRangeLabel.IsVisible = false; lblDamageFalloffRange.IsVisible = false; lblMagazineSizeLabel.IsVisible = false; lblMagazineSize.IsVisible = false; lblBlockDamageLabel.IsVisible = true; lblBlockDamage.IsVisible = true; lblAttacksPerMinuteLabel.IsVisible = true; lblAttacksPerMinute.IsVisible = true; lblStaminaLossLabel.IsVisible = true; lblStaminaLoss.IsVisible = true; int entityDamagePrimary = (int)EffectManager.GetValue(PassiveEffects.EntityDamage, itemValue, 0, player, null, FastTags.Parse("primary")); int entityDamageSecondary = (int)EffectManager.GetValue(PassiveEffects.EntityDamage, itemValue, 0, player, null, FastTags.Parse("secondary")); if (entityDamagePrimary == 0) { lblEntityDamage.Text = $"{entityDamage}"; } else { if (entityDamagePrimary == entityDamageSecondary) { lblEntityDamage.Text = $"{entityDamagePrimary}"; } else { lblEntityDamage.Text = $"{entityDamagePrimary} ({entityDamageSecondary})"; } } lblEntityDamage.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen EntityDamage (Primary):" + (int)EffectManager.GetValue(PassiveEffects.EntityDamage, itemValue, 0, player, null, FastTags.Parse("primary"))); //Log.Out("XUiC_RandomItemRebirth-OnOpen EntityDamage (Secondary):" + (int)EffectManager.GetValue(PassiveEffects.EntityDamage, itemValue, 0, player, null, FastTags.Parse("secondary"))); lblBlockDamageLabel.IsVisible = true; int blockDamagePrimary = (int)EffectManager.GetValue(PassiveEffects.BlockDamage, itemValue, 0, player, null, FastTags.Parse("primary")); int blockDamageSecondary = (int)EffectManager.GetValue(PassiveEffects.BlockDamage, itemValue, 0, player, null, FastTags.Parse("secondary")); if (blockDamagePrimary == 0) { lblBlockDamage.Text = $"{blockDamage}"; } else { if (blockDamagePrimary == blockDamageSecondary) { lblBlockDamage.Text = $"{blockDamagePrimary}"; } else { lblBlockDamage.Text = $"{blockDamagePrimary} ({blockDamageSecondary})"; } } lblBlockDamage.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen BlockDamage (Primary):" + blockDamagePrimary); //Log.Out("XUiC_RandomItemRebirth-OnOpen BlockDamage (Secondary):" + blockDamageSecondary); lblAttacksPerMinuteLabel.IsVisible = true; lblAttacksPerMinute.Text = $"{(int)EffectManager.GetValue(PassiveEffects.AttacksPerMinute, itemValue)}"; lblAttacksPerMinute.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen AttacksPerMinute:" + (int)EffectManager.GetValue(PassiveEffects.AttacksPerMinute, itemValue)); lblStaminaLossLabel.IsVisible = true; int staminaLossPrimary = (int)EffectManager.GetValue(PassiveEffects.StaminaLoss, itemValue, 0, player, null, FastTags.Parse("primary")); int staminaLossSecondary = (int)EffectManager.GetValue(PassiveEffects.StaminaLoss, itemValue, 0, player, null, FastTags.Parse("secondary")); if (staminaLossPrimary == 0) { lblStaminaLoss.Text = $"{staminaLoss}"; } else { if (staminaLossPrimary == staminaLossSecondary) { lblStaminaLoss.Text = $"{staminaLossPrimary}"; } else { lblStaminaLoss.Text = $"{staminaLossPrimary} ({staminaLossSecondary})"; } } lblStaminaLoss.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen StaminaLoss (Primary):" + staminaLossPrimary); //Log.Out("XUiC_RandomItemRebirth-OnOpen StaminaLoss (Secondary):" + staminaLossSecondary); } else if (randomWeapon.Type == WeaponType.Ranged) { // RANGED lblBlockDamageLabel.IsVisible = false; lblBlockDamage.IsVisible = false; lblAttacksPerMinuteLabel.IsVisible = false; lblAttacksPerMinute.IsVisible = false; lblStaminaLossLabel.IsVisible = false; lblStaminaLoss.IsVisible = false; lblRoundsPerMinuteLabel.IsVisible = true; lblRoundsPerMinute.IsVisible = true; lblDamageFalloffRangeLabel.IsVisible = true; lblDamageFalloffRange.IsVisible = true; lblMagazineSizeLabel.IsVisible = true; lblMagazineSize.IsVisible = true; lblEntityDamage.Text = $"{entityDamage}"; lblEntityDamage.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen EntityDamage (Primary):" + entityDamage); lblRoundsPerMinuteLabel.IsVisible = true; lblRoundsPerMinute.Text = $"{(int)EffectManager.GetValue(PassiveEffects.RoundsPerMinute, itemValue)}"; lblRoundsPerMinute.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen RoundsPerMinute:" + (int)EffectManager.GetValue(PassiveEffects.RoundsPerMinute, itemValue)); lblDamageFalloffRangeLabel.IsVisible = true; lblDamageFalloffRange.Text = $"{(int)EffectManager.GetValue(PassiveEffects.DamageFalloffRange, itemValue)}"; lblDamageFalloffRange.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen DamageFalloffRange:" + (int)EffectManager.GetValue(PassiveEffects.DamageFalloffRange, itemValue)); lblMagazineSizeLabel.IsVisible = true; lblMagazineSize.Text = $"{(int)EffectManager.GetValue(PassiveEffects.MagazineSize, itemValue)}"; lblMagazineSize.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen MagazineSize:" + (int)EffectManager.GetValue(PassiveEffects.MagazineSize, itemValue)); } // COMMON lblName.Text = Localization.Get(itemValue.ItemClass.Name); lblName.IsDirty = true; lblDegradationMax.Text = $"{(int)EffectManager.GetValue(PassiveEffects.DegradationMax, itemValue)}"; lblDegradationMax.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen DegradationMax:" + (int)EffectManager.GetValue(PassiveEffects.DegradationMax, itemValue)); lblModSlots.Text = $"{(int)EffectManager.GetValue(PassiveEffects.ModSlots, itemValue)}"; lblModSlots.IsDirty = true; //Log.Out("XUiC_RandomItemRebirth-OnOpen ModSlots:" + (int)EffectManager.GetValue(PassiveEffects.ModSlots, itemValue)); lblBonus.Text = $"{Localization.Get("xui" + (string)itemValue.GetMetadata("bonus"))} [c9c7c7]([-]{Localization.Get("ttLevelFull")} [e0dcab]{(int)itemValue.GetMetadata("level")}[-][c9c7c7])[-]"; lblBonus.IsDirty = true; spriteItemImage.SpriteName = "ui_game_symbol_" + itemValue.ItemClass.GetIconName(); spriteItemImage.IsDirty = true; spriteBonusTypeIcon.SpriteName = "ui_game_symbol_" + (string)itemValue.GetMetadata("bonus"); spriteBonusTypeIcon.IsDirty = true; cannotTrade = false; float durability = 1 - itemValue.UseTimes; float multiplier = 1 + ((float)(RebirthUtilities.GetTier(itemValue.ItemClass) * tierMultiplier)); int numBlueprints = (int)(0.16 * (durability * 100 * multiplier) * (1 - barterPerc) * multiplierBlueprint); int cash = (int)(9 * (durability * 100 * multiplier) * (1 - barterPerc) * multiplierCash); string cashColor = "[ffffff]"; string blueprintColor = "[ffffff]"; string blueprint = RebirthUtilities.GetBlueprint(itemValue.ItemClass); //Log.Out("XUiC_RandomItemRebirth-OnOpen blueprint:" + blueprint); int totalCash = RebirthUtilities.numItems(ItemClass.GetItem("casinoCoin"), player); int totalBlueprints = RebirthUtilities.numItems(ItemClass.GetItem("geneticBlueprint" + blueprint), player); if (totalCash < cash) { cashColor = "[c79595]"; cannotTrade = true; } if (totalBlueprints < numBlueprints) { blueprintColor = "[c79595]"; cannotTrade = true; } lblTotalCash.Text = cashColor + cash.ToString() + "[-]"; lblTotalBlueprints.Text = blueprintColor + numBlueprints.ToString() + "[-]"; if (cannotTrade) { ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnPurchase")).Enabled = false; } else { ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnPurchase")).Enabled = true; } cashImage.spriteName = "ui_game_symbol_oldCash"; blueprintImage.spriteName = "ui_game_symbol_FR_Blueprint" + blueprint; blueprintImage.isDirty = true; lblPurchaseCost.Text = Localization.Get("xuiPurchaseItemExchange"); } } else { lblName.Text = "-"; lblEntityDamage.Text = "-"; lblBlockDamage.Text = "-"; lblAttacksPerMinute.Text = "-"; lblStaminaLoss.Text = "-"; lblRoundsPerMinute.Text = "-"; lblDamageFalloffRange.Text = "-"; lblMagazineSize.Text = "-"; lblDegradationMax.Text = "-"; lblModSlots.Text = "-"; lblBonus.Text = "-"; spriteItemImage.spriteName = ""; spriteBonusTypeIcon.spriteName = ""; cashImage.spriteName = ""; blueprintImage.spriteName = ""; spriteItemImage.isDirty = true; spriteBonusTypeIcon.isDirty = true; cashImage.isDirty = true; blueprintImage.isDirty = true; lblTotalCash.Text = ""; lblTotalBlueprints.Text = ""; ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnPurchase")).Enabled = false; lblPurchaseCost.Text = Localization.Get("xuiPurchaseItemNothingExchange"); } int charismaBlueprints = RebirthUtilities.numItems(ItemClass.GetItem("geneticBlueprintCharisma"), player); int multiplierRefresh = (int)(1 + ((questTier - 1) * 0.75)); int numCharismaBlueprints = (int)(15 * (1 - barterPerc) * multiplierRefresh); if (charismaBlueprints >= numCharismaBlueprints) { ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnRefresh")).Enabled = true; lblRefreshCost.Text = numCharismaBlueprints.ToString(); refreshImage.spriteName = "ui_game_symbol_FR_BlueprintCharisma"; refreshImage.isDirty = true; } else { ((XUiC_SimpleButton)Panel.Controller.GetChildById("btnRefresh")).Enabled = false; lblRefreshCost.Text = "[c79595]" + numCharismaBlueprints.ToString() + "[-]"; refreshImage.spriteName = "ui_game_symbol_FR_BlueprintCharisma"; refreshImage.isDirty = true; } } public void Reset() { cbxRandomWeapon.Elements.Clear(); if (RebirthVariables.randomWeapons.Count > 0) { for (int i = 1; i < RebirthVariables.randomWeapons.Count + 1; i++) { this.cbxRandomWeapon.Elements.Add(i.ToString()); } cbxRandomWeapon.SelectedIndex = 0; } } public override void OnOpen() { base.OnOpen(); EntityPlayer player = xui.playerUI.entityPlayer; float progressionLevel = 0; ProgressionValue progressionValue = player.Progression.GetProgressionValue("perkBetterBarter"); if (progressionValue != null) { progressionLevel = RebirthUtilities.GetCalculatedLevel(player, progressionValue); } barterPerc = progressionLevel * barterPercUnit; LabelDescription.Text = Localization.Get("xuiItemsToPurchaseDescription").Replace("{0}", ((int)(barterPerc * 100)).ToString() + "%"); Reset(); updateItem(); } private void BtnCancel_OnPressed(XUiController _sender, int _mouseButton) { //Log.Out("XUiC_RandomItemRebirth-BtnCancel_OnPressed START"); Panel.IsVisible = false; xui.playerUI.windowManager.Close(windowGroup.ID); } private void BtnRefresh_OnPressed(XUiController _sender, int _mouseButton) { //Log.Out("XUiC_RandomItemRebirth-BtnRefresh_OnPressed currentTrackedItem.Slot: " + currentTrackedItem.Slot); EntityPlayer player = xui.playerUI.entityPlayer; RebirthUtilities.useInventoryBagItem(player, "geneticBlueprintCharisma", 15); RebirthUtilities.RefreshRandomWeapons((EntityPlayerLocal)player); RebirthVariables.randomWeaponUpdateCheck = Time.time; Reset(); updateItem(); } private void BtnPurchase_OnPressed(XUiController _sender, int _mouseButton) { //Log.Out("XUiC_RandomItemRebirth-BtnPurchase_OnPressed currentTrackedItem.Slot: " + currentTrackedItem.Slot); EntityPlayer player = xui.playerUI.entityPlayer; currentItem.SetMetadata("active", 1, TypedMetadataValue.TypeTag.Integer); RebirthUtilities.addToPlayerBag(currentItem, player, 1); float durability = 1 - currentItem.UseTimes; float multiplier = 1 + ((float)(RebirthUtilities.GetTier(currentItem.ItemClass) * tierMultiplier)); int numBlueprints = (int)(0.16 * (durability * 100 * multiplier) * (1 - barterPerc) * multiplierBlueprint); int cash = (int)(9 * (durability * 100 * multiplier) * (1 - barterPerc) * multiplierCash); string blueprint = RebirthUtilities.GetBlueprint(currentItem.ItemClass); RebirthUtilities.useInventoryBagItem(player, "casinoCoin", cash); RebirthUtilities.useInventoryBagItem(player, "geneticBlueprint" + blueprint, numBlueprints); RebirthVariables.randomWeapons.RemoveAt(cbxRandomWeapon.SelectedIndex); Reset(); updateItem(); } public override void OnClose() { //Log.Out("XUiC_RandomItemRebirth-OnClose START"); if (xui.playerUI.windowManager.HasWindow("dialog") && xui.playerUI.windowManager.IsWindowOpen("dialog")) xui.playerUI.windowManager.Close("dialog"); base.OnClose(); } }