/// <summary> /// Tracks internal special coodowns and handles switching back of weapons. /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void OnUpdateTicked(object sender, UpdateTickedEventArgs e) { if (Game1.shouldTimePass()) { if (cachedCooldown > 0) { cachedCooldown -= (1000 / 60); } if (defenseCooldown > 0) { defenseCooldown -= (1000 / 60); } if (slowCooldown) { if (MeleeWeapon.defenseCooldown > 0) { MeleeWeapon.defenseCooldown = (int)(defenseCooldown * cooldownRatio); } else { slowCooldown = false; } } //if (e.IsMultipleOf(10)) // Monitor.Log($"dagCD: {MeleeWeapon.daggerCooldown} ({cachedCooldown}): defCD: {MeleeWeapon.defenseCooldown} ({defenseCooldown})", LogLevel.Debug); } if (cachedWeapon != null && Game1.player.CurrentTool == stabWeapon) { if (!stabWeapon.isOnSpecial) { MeleeWeapon.daggerCooldown = (int)cachedCooldown; if (!firstTickMeansSpecialFailed) { MeleeWeapon.defenseCooldown = (int)(defenseCooldown * cooldownRatio); slowCooldown = true; } Monitor.Log($"Weapon swapped back: special execution = {slowCooldown}", LogLevel.Trace); Game1.player.removeItemFromInventory(replacementIndex); Game1.player.addItemToInventory(cachedWeapon, replacementIndex); cachedWeapon = null; stabWeapon = null; } firstTickMeansSpecialFailed = false; } }
/********* ** Private methods *********/ /// <summary>Raised after the player presses a button on the keyboard, controller, or mouse.</summary> /// <param name="sender">The event sender.</param> /// <param name="e">The event data.</param> private void OnButtonPressed(object sender, ButtonPressedEventArgs e) { if (Context.IsWorldReady && Game1.currentLocation != null && e.Button.IsActionButton() && Game1.activeClickableMenu == null && Game1.player.CurrentTool != null && Game1.player.CurrentTool.GetType().Equals(typeof(MeleeWeapon)) && Game1.player.CanMove ) { MeleeWeapon activeWeapon = (MeleeWeapon)Game1.player.CurrentTool; if (Helper.Reflection.GetMethod(activeWeapon, "specialCooldown").Invoke <int>() <= 0 && !activeWeapon.isScythe() && activeWeapon.type == 3 || activeWeapon.type == 0) { Monitor.Log($"Intercepting special move!", LogLevel.Trace); if (Config.FaceCursorForSpecial) { Game1.player.faceGeneralDirection(e.Cursor.AbsolutePixels); } cachedWeapon = activeWeapon; if (MeleeWeapon.daggerCooldown > 0) { cachedCooldown = MeleeWeapon.daggerCooldown; } MeleeWeapon.daggerCooldown = 0; defenseCooldown = Config.BaseCooldownOfSpecial * 1000; if (Game1.player.professions.Contains(28)) { defenseCooldown /= 2; } if (cachedWeapon.hasEnchantmentOfType <ArtfulEnchantment>()) { defenseCooldown /= 2; } stabWeapon = new StabbingSwordWeapon(activeWeapon, Config.FlurryDamageMult); replacementIndex = Game1.player.CurrentToolIndex; Game1.player.removeItemFromInventory(replacementIndex); Game1.player.addItemToInventory(stabWeapon, replacementIndex); firstTickMeansSpecialFailed = true; Monitor.Log($"Replaced MeleeWeapon with StabbingSwordWeapon", LogLevel.Trace); } } }