/
NLObP
/
AAEmu
Обзор
Документация
Войти
/
NLObP
/
AAEmu
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
AAEmu.Game/Scripts/Commands/ChangeLevel.cs
133 строки
4 KB
Mark Preston
[Game] Implement mate level cap (#1145)
21 янв 2025, 22:14
Не верифицирован
21 янв 2025, 22:14
f7a416c
Код
Авторство
О чём код?
using AAEmu.Game.Core.Managers; using AAEmu.Game.Core.Packets.G2C; using AAEmu.Game.Models.Game; using AAEmu.Game.Models.Game.Char; using AAEmu.Game.Models.Game.Skills; using AAEmu.Game.Core.Managers.World; using AAEmu.Game.Models.Game.Units; using AAEmu.Game.Utils.Scripts; namespace AAEmu.Game.Scripts.Commands; public class ChangeLevel : ICommand { public string[] CommandNames { get; set; } = ["level", "setlevel", "set_level", "change_level", "changelevel"]; public void OnLoad() { CommandManager.Instance.Register(CommandNames, this); } public string GetCommandLineHelp() { return "(target) <level>"; } public string GetCommandHelpText() { return $"Adds experience points needed to reach target <level>\n" + $"Allowed range is 2-{ExperienceManager.Instance.MaxPlayerLevel} and {ExperienceManager.Instance.MaxMateLevel} for pets\n"; } public void Execute(Character character, string[] args, IMessageOutput messageOutput) { if (args.Length == 0) { CommandManager.SendDefaultHelpText(this, messageOutput); //character.SendMessage("[Level] level: 1-100"); return; } var targetPlayer = WorldManager.GetTargetOrSelf(character, args[0], out var firstArg); byte level = 0; if (byte.TryParse(args[firstArg + 0], out var parseLevel)) { level = parseLevel; } if (character.CurrentTarget is Mate mate) { if (level <= 1 || level > ExperienceManager.Instance.MaxMateLevel) { CommandManager.SendErrorText(this, messageOutput, $"Allowed level range: 2-{ExperienceManager.Instance.MaxMateLevel}|r"); return; } var expForTargetLevel = ExperienceManager.Instance.GetExpForLevel(level, true) - mate.Experience; if (expForTargetLevel > 0) { mate.AddExp(expForTargetLevel); } if (level > mate.Level) { mate.BroadcastPacket(new SCLevelChangedPacket(mate.ObjId, level), true); } } else { if (level <= 1 || level > ExperienceManager.Instance.MaxPlayerLevel) { CommandManager.SendErrorText(this, messageOutput, $"Allowed level range: 2-{ExperienceManager.Instance.MaxPlayerLevel}|r"); return; } var maxExpToAdd = 0; if (targetPlayer.Ability1 != AbilityType.None) { var expForA1 = ExperienceManager.Instance.GetExpNeededToGivenLevel( targetPlayer.Abilities.Abilities[targetPlayer.Ability1].Exp, level); if (expForA1 > maxExpToAdd) { maxExpToAdd = expForA1; } } if (targetPlayer.Ability2 != AbilityType.None) { var expForA2 = ExperienceManager.Instance.GetExpNeededToGivenLevel( targetPlayer.Abilities.Abilities[targetPlayer.Ability2].Exp, level); if (expForA2 > maxExpToAdd) { maxExpToAdd = expForA2; } } if (targetPlayer.Ability3 != AbilityType.None) { var expForA3 = ExperienceManager.Instance.GetExpNeededToGivenLevel( targetPlayer.Abilities.Abilities[targetPlayer.Ability3].Exp, level); if (expForA3 > maxExpToAdd) { maxExpToAdd = expForA3; } } var expForLevel = ExperienceManager.Instance.GetExpNeededToGivenLevel(targetPlayer.Experience, level); if (expForLevel > maxExpToAdd) { maxExpToAdd = expForLevel; } // Add maximum required xp to get to target levels if (maxExpToAdd > 0) { targetPlayer.AddExp(maxExpToAdd, true); } // If the target level is bigger than player's current level, refill HP/MP if (level > targetPlayer.Level) { targetPlayer.Hp = targetPlayer.MaxHp; targetPlayer.Mp = targetPlayer.MaxMp; } } } }