Example #1
0
        /// <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);
        }
Example #2
0
        /// <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);
        }
Example #3
0
        /// <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);
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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));
        }
Example #6
0
        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;
            }
        }