/// <summary> /// Applies a recast delay on a specific recast group. /// If group is invalid or delay amount is less than or equal to zero, nothing will happen. /// </summary> /// <param name="activator">The activator of the ability.</param> /// <param name="group">The recast group to put this delay under.</param> /// <param name="delaySeconds">The number of seconds to delay.</param> private static void ApplyRecastDelay(uint activator, RecastGroup group, float delaySeconds) { if (!GetIsObjectValid(activator) || group == RecastGroup.Invalid || delaySeconds <= 0.0f) { return; } var recastDate = DateTime.UtcNow.AddSeconds(delaySeconds); // NPCs and DM-possessed NPCs if (!GetIsPC(activator) || GetIsDMPossessed(activator)) { var recastDateString = recastDate.ToString("yyyy-MM-dd hh:mm:ss"); SetLocalString(activator, $"ABILITY_RECAST_ID_{(int)group}", recastDateString); } // Players else if (GetIsPC(activator) && !GetIsDM(activator)) { var playerId = GetObjectUUID(activator); var dbPlayer = DB.Get <Entity.Player>(playerId); dbPlayer.RecastTimes[group] = recastDate; DB.Set(playerId, dbPlayer); } }
/// <summary> /// Assigns a recast delay on the active ability we're building. /// This prevents the ability from being used again until the specified time has passed. /// Calling this more than once will replace the previous recast delay. /// </summary> /// <param name="recastGroup">The recast group this delay will fall under.</param> /// <param name="seconds">The number of seconds to delay.</param> /// <returns>An ability builder with the configured options.</returns> public AbilityBuilder HasRecastDelay(RecastGroup recastGroup, float seconds) { _activeAbility.RecastGroup = recastGroup; _activeAbility.RecastDelay = activator => seconds; return(this); }
/// <summary> /// Assigns a recast delay on the active ability we're building. /// This prevents the ability from being used again until the specified time has passed. /// Calling this more than once will replace the previous recast delay. /// </summary> /// <param name="recastGroup">The recast group this delay will fall under.</param> /// <param name="delay">An action which determines the recast delay.</param> /// <returns>An ability builder with the configured options.</returns> public AbilityBuilder HasRecastDelay(RecastGroup recastGroup, AbilityRecastDelayAction delay) { _activeAbility.RecastGroup = recastGroup; _activeAbility.RecastDelay = delay; return(this); }
private static string BuildTimerText(RecastGroup group, DateTime now, DateTime recastTime) { var recastName = (Ability.GetRecastGroupName(group) + ":").PadRight(14, ' '); var delta = recastTime - now; var formatTime = delta.ToString(@"hh\:mm\:ss").PadRight(8, ' '); return(recastName + formatTime); }
/// <summary> /// Retrieves the human-readable name of a recast group. /// </summary> /// <param name="recastGroup">The recast group to retrieve.</param> /// <returns>The name of a recast group.</returns> public static string GetRecastGroupName(RecastGroup recastGroup) { if (!_recastDescriptions.ContainsKey(recastGroup)) { throw new KeyNotFoundException($"Recast group {recastGroup} has not been registered. Did you forget the Description attribute?"); } return(_recastDescriptions[recastGroup]); }
/// <summary> /// Returns true if a recast delay has not expired yet. /// Returns false if there is no recast delay or the time has already passed. /// </summary> /// <param name="creature">The creature to check</param> /// <param name="recastGroup">The recast group to check</param> /// <returns>true if recast delay hasn't passed. false otherwise</returns> public static bool IsOnRecastDelay(uint creature, RecastGroup recastGroup) { if (GetIsDM(creature)) { return(false); } var now = DateTime.UtcNow; // Players if (GetIsPC(creature) && !GetIsDMPossessed(creature)) { var playerId = GetObjectUUID(creature); var dbPlayer = DB.Get <Entity.Player>(playerId); if (!dbPlayer.RecastTimes.ContainsKey(recastGroup)) { return(false); } if (now >= dbPlayer.RecastTimes[recastGroup]) { return(false); } else { string timeToWait = Time.GetTimeToWaitLongIntervals(now, dbPlayer.RecastTimes[recastGroup], false); SendMessageToPC(creature, $"This ability can be used in {timeToWait}."); return(true); } } // NPCs and DM-possessed NPCs else { string unlockDate = GetLocalString(creature, $"ABILITY_RECAST_ID_{(int)recastGroup}"); if (string.IsNullOrWhiteSpace(unlockDate)) { return(false); } else { var dateTime = DateTime.ParseExact(unlockDate, "yyyy-MM-dd hh:mm:ss", CultureInfo.InvariantCulture); if (now >= dateTime) { return(false); } else { string timeToWait = Time.GetTimeToWaitLongIntervals(now, dateTime, false); SendMessageToPC(creature, $"This ability can be used in {timeToWait}."); return(true); } } } }