/// <summary> /// Returns the minimum vitae for a player level /// </summary> public float GetMinVitae(uint level) { var propVitae = PropertyManager.GetDouble("vitae_min").Item; var maxPenalty = (level - 1) * 3; if (maxPenalty < 1) { maxPenalty = 1; } var globalMax = 100 - (uint)Math.Round(propVitae * 100); if (maxPenalty > globalMax) { maxPenalty = globalMax; } var minVitae = (100 - maxPenalty) / 100.0f; if (minVitae < propVitae) { minVitae = (float)propVitae; } return(minVitae); }
/// <summary> /// Called on player death /// </summary> public float UpdateVitae() { BiotaPropertiesEnchantmentRegistry vitae = null; if (!HasVitae) { // add entry for new vitae vitae = BuildEntry((uint)Spell.Vitae); vitae.EnchantmentCategory = (uint)EnchantmentMask.Vitae; vitae.LayerId = 0; vitae.StatModValue = 1.0f - (float)PropertyManager.GetDouble("vitae_penalty").Item; WorldObject.Biota.BiotaPropertiesEnchantmentRegistry.Add(vitae); } else { // update existing vitae vitae = GetVitae(); vitae.StatModValue -= (float)PropertyManager.GetDouble("vitae_penalty").Item; } var player = WorldObject as Player; var minVitae = GetMinVitae((uint)player.Level); if (vitae.StatModValue < minVitae) { vitae.StatModValue = minVitae; } SaveDatabase(); return(vitae.StatModValue); }
/// <summary> /// Called on player death /// </summary> public virtual float UpdateVitae() { if (Player == null) { return(0); } BiotaPropertiesEnchantmentRegistry vitae; if (!HasVitae) { // TODO refactor this so it uses the existing Add() method. // add entry for new vitae var spell = new Spell(SpellId.Vitae); vitae = BuildEntry(spell); vitae.EnchantmentCategory = (uint)EnchantmentMask.Vitae; vitae.LayerId = 1; // This should be 0 but EF Core seems to be very unhappy with 0 as the layer id now that we're using layer as part of the composite key. vitae.StatModValue = 1.0f - (float)PropertyManager.GetDouble("vitae_penalty").Item; WorldObject.Biota.AddEnchantment(vitae, WorldObject.BiotaDatabaseLock); WorldObject.ChangesDetected = true; } else { // update existing vitae vitae = GetVitae(); vitae.StatModValue -= (float)PropertyManager.GetDouble("vitae_penalty").Item; WorldObject.ChangesDetected = true; } var minVitae = GetMinVitae((uint)Player.Level); if (vitae.StatModValue < minVitae) { vitae.StatModValue = minVitae; } return(vitae.StatModValue); }
/// <summary> /// Called on player death /// </summary> public virtual float UpdateVitae() { if (Player == null) { return(0); } BiotaPropertiesEnchantmentRegistry vitae; if (!HasVitae) { // TODO refactor this so it uses the existing Add() method. // add entry for new vitae vitae = BuildEntry((uint)Spell.Vitae); vitae.EnchantmentCategory = (uint)EnchantmentMask.Vitae; vitae.LayerId = 0; vitae.StatModValue = 1.0f - (float)PropertyManager.GetDouble("vitae_penalty").Item; WorldObject.Biota.AddEnchantment(vitae, WorldObject.BiotaDatabaseLock); WorldObject.ChangesDetected = true; } else { // update existing vitae vitae = GetVitae(); vitae.StatModValue -= (float)PropertyManager.GetDouble("vitae_penalty").Item; } var minVitae = GetMinVitae((uint)Player.Level); if (vitae.StatModValue < minVitae) { vitae.StatModValue = minVitae; } RemoveAllEnchantments(); return(vitae.StatModValue); }
/// <summary> /// Returns the time remaining until the player can solve this quest again /// </summary> public TimeSpan GetNextSolveTime(string questFormat) { var questName = GetQuestName(questFormat); var quest = DatabaseManager.World.GetCachedQuest(questName); if (quest == null) { return(TimeSpan.MaxValue); // world quest not found - cannot solve it } var playerQuest = GetQuest(questName); if (playerQuest == null) { return(TimeSpan.MinValue); // player hasn't completed this quest yet - can solve immediately } if (quest.MaxSolves > -1 && playerQuest.NumTimesCompleted >= quest.MaxSolves) { return(TimeSpan.MaxValue); // cannot solve this quest again - max solves reached / exceeded } var currentTime = (uint)Time.GetUnixTime(); var nextSolveTime = playerQuest.LastTimeCompleted + (uint)(quest.MinDelta * PropertyManager.GetDouble("quest_mindelta_rate", 1).Item); if (currentTime >= nextSolveTime) { return(TimeSpan.MinValue); // can solve again now - next solve time expired } // return the time remaining on the player's quest timer return(TimeSpan.FromSeconds(nextSolveTime - currentTime)); }
public static void UpdatePKStatusForAllPlayers(string worldType, bool enabled) { switch (worldType) { case "pk_server": if (enabled) { foreach (var player in GetAllOnline()) { player.SetPlayerKillerStatus(PlayerKillerStatus.PK, true); } foreach (var player in GetAllOffline()) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); player.SetProperty(PropertyFloat.MinimumTimeSincePk, 0); } BroadcastToAll(new GameMessageSystemChat($"This world has been changed to a Player Killer world. All players will become Player Killers in {PropertyManager.GetDouble("pk_respite_timer").Item} seconds.", ChatMessageType.WorldBroadcast)); } else { foreach (var player in GetAllOnline()) { player.SetPlayerKillerStatus(PlayerKillerStatus.NPK, true); } foreach (var player in GetAllOffline()) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); player.SetProperty(PropertyFloat.MinimumTimeSincePk, 0); } BroadcastToAll(new GameMessageSystemChat("This world has been changed to a Non Player Killer world. All players are now Non-Player Killers.", ChatMessageType.WorldBroadcast)); } break; case "pkl_server": if (PropertyManager.GetBool("pk_server").Item) { return; } if (enabled) { foreach (var player in GetAllOnline()) { player.SetPlayerKillerStatus(PlayerKillerStatus.PKLite, true); } foreach (var player in GetAllOffline()) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); player.SetProperty(PropertyFloat.MinimumTimeSincePk, 0); } BroadcastToAll(new GameMessageSystemChat($"This world has been changed to a Player Killer Lite world. All players will become Player Killer Lites in {PropertyManager.GetDouble("pk_respite_timer").Item} seconds.", ChatMessageType.WorldBroadcast)); } else { foreach (var player in GetAllOnline()) { player.SetPlayerKillerStatus(PlayerKillerStatus.NPK, true); } foreach (var player in GetAllOffline()) { player.SetProperty(PropertyInt.PlayerKillerStatus, (int)PlayerKillerStatus.NPK); player.SetProperty(PropertyFloat.MinimumTimeSincePk, 0); } BroadcastToAll(new GameMessageSystemChat("This world has been changed to a Non Player Killer world. All players are now Non-Player Killers.", ChatMessageType.WorldBroadcast)); } break; } }