//XP public override long XpGain(long xpGain, int mod = 1) { if (mod < 1) { mod = Verify.Min(level, 1); } experience += xpGain = NumbersM.CeilParse <long>(Verify.Min((xpGain * ReferenceData.xprate) / mod, 10)); long reqXPToLVL = Quadratic.XPCalc(level + 1); while (experience >= reqXPToLVL) { _ = Handlers.UniqueChannels.Instance.SendMessage("Population", displayName + " leveled up!"); level++; KCoins += level * 10; stats.maxhealth += 5; experience -= reqXPToLVL; reqXPToLVL = Quadratic.XPCalc(level + 1); if (role == CombatRole.None && level >= 20) { GetCombatRole(); } if (IsGainSkillPoint()) { AddStats(); } } return(xpGain); }
internal void ScaleNPC(double mult = 1) { double buffPercent = //level/(double)baseLevel* 2 Exponential.CreatureScale(baseLevel, level) * mult; //Stats stats.maxhealth = NumbersM.CeilParse <long>(stats.maxhealth * (1 + buffPercent * 5)); stats.stamina = NumbersM.CeilParse <int>(stats.stamina * (1 + buffPercent * 2)); health = Health(); stamina = Stamina(); for (int i = 0; i < DmgType.Length; i++) { if (stats.damage[i] > 0) { stats.damage[i] = NumbersM.CeilParse <long>(stats.damage[i] * (1 + buffPercent / 3)); } if (stats.resistance[i] > 0) { stats.resistance[i] = NumbersM.CeilParse <int>(stats.resistance[i] * (1 + (buffPercent / 5))); } } //Extra Drops if (Program.rng.Next(101) <= 1) { Item tempSchem = SkaviDrops.DropSchematic(race); if (tempSchem != null) { AddItemToInv(tempSchem); } } }
internal Item ScaleArmor(Item item, int target) { double m = ((double)target) / item.tier; double n = m - 1; #region Excluded stats long l = 0; foreach (int r in item.damage) { l += r > 0 ? NumbersM.CeilParse <long>(n * r * damage) : 0; } l += NumbersM.CeilParse <long>( +(item.durability + item.agility + Convert.ToInt64(item.critChance) + Convert.ToInt64(item.critMult) + (item.perk != null ? (item.perk.tier + 1) * perk : 0) ) * n); #endregion #region Included Stats long i = (item.healthBuff != 0 ? health : 0) + (item.staminaBuff != 0 ? stamina : 0); foreach (var d in item.resistance) { i += d != 0 ? resistance : 0; } #endregion //Update stats item.healthBuff = item.healthBuff != 0 ? item.healthBuff = NumbersM.CeilParse <long>( (item.healthBuff * m) + ((health * (l + 0.00) / i) / health)) : 0; item.staminaBuff = item.staminaBuff != 0 ? item.staminaBuff = NumbersM.CeilParse <int>( (item.staminaBuff * m) + ((stamina * (l + 0.00) / i) / stamina)) : 0; for (int k = 0; k < item.resistance.Length; k++) { if (item.resistance[k] != 0) { item.resistance[k] = NumbersM.FloorParse <int>( (item.resistance[k] * m) + ((resistance * (l + 0.00) / i) / resistance)); } } return(item); }
void FollowerCheck(NPC n, Party party, bool allPlayersDead) { int s = n.HealthStatus(out string status); /// >= 0 Is alive /// -1 is Down, -2 Fainted, -3 Unconscious, -4 Dead, -5 Vaporized if (s < -1 || allPlayersDead) { if (n.IsPet()) { if (party != null && s <= -4) { party.Remove(party.NPCMembers.FindIndex (x => x.origin == n.origin), null); } else { n.health = n.Health(); n.stamina = n.Stamina(); } } else { if (party != null) { party.NPCMembers.RemoveAt(party.NPCMembers.FindIndex (x => x.displayName == n.displayName)); } if (s > -4) { n.Respawn(); } } } else if (s >= -1) { long fullHealthCost = Verify.Max( NumbersM.NParse <long>(100 - (((n.health + 0.00) / n.Health()) * 100)) , n.KCoins); if (fullHealthCost > 0) { n.KCoins -= fullHealthCost; n.health += NumbersM.CeilParse <long>(n.Health() * (fullHealthCost / 100.00)); } n.stamina = n.Stamina(); n.SelfGear(); } }
internal Item ScaleWeapon(Item item, int target) { double m = (double)target / item.tier; double n = m - 1; long l = 0; #region Excluded stats foreach (int r in item.resistance) { l += r != 0 ? NumbersM.CeilParse <int>(n * r * resistance) : 0; } try { l += NumbersM.CeilParse <long>(item.healthBuff * health * n) + NumbersM.CeilParse <long>(item.staminaBuff * stamina * n) + NumbersM.CeilParse <long>( ( item.durability + item.agility + item.critChance + item.critMult + (item.perk != null ? (item.perk.tier + 1) * perk : 0) ) * n ); } catch (Exception e) { Console.WriteLine("Error in other math"); throw e; } #endregion long i = 0; foreach (var d in item.damage) { i += d > 0 ? damage : 0; } for (int k = 0; k < item.damage.Length; k++) { if (item.damage[k] > 0) { item.damage[k] = NumbersM.CeilParse <long>( (item.damage[k] * m) + ((damage * l / i) / damage)); } } return(item); }
public object[] TakeOnMe(CombatResult owner, CombatResult enemy) { if (enemy.abilityUsed.type == Ability.AType.Elemental || enemy.abilityUsed.type == Ability.AType.Enchantment || enemy.abilityUsed.type == Ability.AType.Martial) { if (!enemy.SentHit && RNG(101) <= 15) { enemy.sentHit = true; } if (enemy.SentHit && RNG(101) <= 10) { long healed = owner.character.Healing(NumbersM.CeilParse <long>(owner.character.Health() * 0.10), true); owner.perkProcs.Add($"{owner.Name} proc'ed {name}'s healing [+{healed} health]"); } } return(new object[] { owner, enemy }); }
internal bool ConsumeHealing() { int index = inventory.FindIndex(Item.IType.Healing); if (index > -1) { Item meds = inventory.GetItem(index); long missingHP = Health() - health; int m = NumbersM.CeilParse <int>(missingHP / (meds.healthBuff + 0f)); int amount = Verify.Max(m, inventory.GetCount(index)); Healing(meds.healthBuff * amount); StaminaE(meds.staminaBuff * amount); inventory.Remove(index, amount); return(true); } return(false); }
internal static async Task ViewSchems(Player player, ISocketMessageChannel chan, int displayPage = 1) { int count = player.schematics.Count; if (count == 0) { throw NeitsilliaError.ReplyError("No known schematics."); } const int itemPerPage = 15; int pages = NumbersM.CeilParse <int>(count / (double)itemPerPage); displayPage = Verify.MinMax(displayPage, pages, 1); int start = (displayPage - 1) * itemPerPage; string desc = string.Join(Environment.NewLine, player.schematics.GetRange( start, start + itemPerPage > count ? count - start : itemPerPage)); EmbedBuilder schems = DUtils.BuildEmbed($"{player.name}'s Schematics", desc, $"Page {displayPage}/{pages}", player.userSettings.Color); await player.NewUI(await chan.SendMessageAsync(embed: schems.Build()), MsgType.Schems, displayPage.ToString()); }
EmbedBuilder DailyReward(Player player) { int coinsgain = ReferenceData.dailyCoinsRates + (player.level * 3); string itemsLoot = null; string temp = null; // StackedItems dailyHealthItem = GetDailyScale(player.level); if (!player.CollectItem(dailyHealthItem)) { long kgain = dailyHealthItem.item.baseValue * dailyHealthItem.count; player.KCoins += (kgain); temp += "+ " + (kgain) + " Kutsyei coins"; } else { temp = dailyHealthItem.ToString(); } itemsLoot += temp + Environment.NewLine; // StackedItems dailyressource = new StackedItems(Item.RandomItem(player.level, Program.rng.Next(3)), 1); if (dailyressource.item.tier < player.level * 1.5) { dailyressource.count = Verify.MinMax(NumbersM.CeilParse <int>((player.level / 5.00) - dailyressource.item.tier), 10, 1); } if (!player.CollectItem(dailyressource)) { player.KCoins += dailyressource.item.baseValue * dailyressource.count; temp = "+ " + (dailyressource.item.baseValue * dailyressource.count) + "Kutsyei coins"; } else { temp = dailyressource.ToString(); } itemsLoot += temp + Environment.NewLine; // itemsLoot += GetDailyGear(player, player.level * 5) + Environment.NewLine; if (player.level < 9) { itemsLoot += GetDailyGear(player, 10, (int)Item.IType.Weapon) + Environment.NewLine; } EmbedBuilder loot = new EmbedBuilder(); // if (Program.dblAPI.connected && false) { loot.WithFooter("Vote on DiscordBot List to receive and open Crates for more rewards. " + Program.dblAPI.WebsiteUrl); } player.KCoins += coinsgain; // loot.WithTitle("Daily Rations"); player.UserEmbedColor(loot); loot.AddField("Kutsyei Coins", $"+{coinsgain}~~K~~"); if (itemsLoot == null) { itemsLoot = "None"; } loot.AddField("Items", itemsLoot); // player.userTimers.dailyLoot = DateTime.UtcNow.AddDays(1); player.SaveFileMongo(); // return(loot); }