/
NLObP
/
AAEmu
Обзор
Документация
Войти
/
NLObP
/
AAEmu
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
AAEmu.Game/Core/Managers/TimedRewardsManager.cs
113 строк
5 KB
Roger Barreto
Adding Dictionary, Cleaning all warnings (#1109)
10 дек 2024, 19:51
Не верифицирован
10 дек 2024, 19:51
7605fdd
Код
Авторство
О чём код?
using System; using AAEmu.Commons.Utils; using AAEmu.Game.Core.Network.Connections; using AAEmu.Game.Core.Packets.G2C; using AAEmu.Game.Models; using AAEmu.Game.Models.Tasks.TimedRewards; namespace AAEmu.Game.Core.Managers; /// <summary> /// For timed adding credits and loyalty /// </summary> public class TimedRewardsManager : Singleton<TimedRewardsManager> { private const short MaxLabor = 2000; private const short MaxLaborPremium = 5000; public void Initialize() { TaskManager.Instance.Schedule(new TimedRewardsTask(), TimeSpan.FromMinutes(1), TimeSpan.FromMinutes(1)); } public static short GetMaxLabor(bool isPremium) { return isPremium ? MaxLaborPremium : MaxLabor; } /// <summary> /// Adds labor, internal use only /// </summary> /// <param name="connection"></param> /// <param name="currentLabor"></param> /// <param name="addLabor"></param> private void DoAddLabor(GameConnection connection, short currentLabor, int addLabor) { var maxLaborToAdd = GetMaxLabor(connection.Payment.PremiumState) - currentLabor; if (maxLaborToAdd < 0) maxLaborToAdd = 0; addLabor = Math.Min(addLabor, maxLaborToAdd); AccountManager.Instance.UpdateTickTimes(connection.AccountId, DateTime.UtcNow, true, false, false); if (addLabor > 0) { var newLabor = (short)(currentLabor + addLabor); AccountManager.Instance.UpdateLabor(connection.AccountId, newLabor); connection.ActiveChar?.SendPacket(new SCCharacterLaborPowerChangedPacket(addLabor, 0, 0, 0)); // Update cache if character was logged in connection.ActiveChar?.InitializeLaborCache(newLabor, DateTime.UtcNow); } } public void DoTick() { if ((AppConfiguration.Instance.Credits.TickMinutes <= 0) && (AppConfiguration.Instance.Loyalty.TickMinutes <= 0)) return; var connections = GameConnectionTable.Instance.GetConnections(); foreach (var connection in connections) { //var character = connection.ActiveChar; // Grab current values for last ticks var accountDetails = AccountManager.Instance.GetAccountDetails(connection.AccountId); // Distribute Labor if needed (only for online labor) if (AppConfiguration.Instance.Labor.TickMinutes > 0 && accountDetails.LastLaborTick.AddMinutes(AppConfiguration.Instance.Labor.TickMinutes) <= DateTime.UtcNow) { var addLabor = AppConfiguration.Instance.Labor.GetTickAmount(connection.Payment.PremiumState); DoAddLabor(connection, accountDetails.Labor, addLabor); } // Distribute Credits if needed if (AppConfiguration.Instance.Credits.TickMinutes > 0 && accountDetails.LastCreditsTick.AddMinutes(AppConfiguration.Instance.Credits.TickMinutes) <= DateTime.UtcNow) { // Update Credits AccountManager.Instance.AddCredits(connection.AccountId, AppConfiguration.Instance.Credits.GetTickAmount(connection.Payment.PremiumState)); AccountManager.Instance.UpdateTickTimes(connection.AccountId, DateTime.UtcNow, false, true, false); connection.ActiveChar?.SendPacket(new SCICSCashPointPacket(AccountManager.Instance.GetAccountDetails(connection.AccountId).Credits)); } // Distribute Loyalty if needed if (AppConfiguration.Instance.Loyalty.TickMinutes > 0 && accountDetails.LastLoyaltyTick.AddMinutes(AppConfiguration.Instance.Loyalty.TickMinutes) <= DateTime.UtcNow) { // Update Loyalty AccountManager.Instance.AddLoyalty(connection.AccountId, AppConfiguration.Instance.Loyalty.GetTickAmount(connection.Payment.PremiumState)); AccountManager.Instance.UpdateTickTimes(connection.AccountId, DateTime.UtcNow, false, false, true); connection.ActiveChar?.SendPacket(new SCBmPointPacket(AccountManager.Instance.GetAccountDetails(connection.AccountId).Loyalty)); } } } public void DoDailyAccountLogin(uint accountId) { if (AppConfiguration.Instance.Credits.DailyLogin > 0) AccountManager.Instance.AddCredits(accountId, AppConfiguration.Instance.Credits.DailyLogin); if (AppConfiguration.Instance.Loyalty.DailyLogin > 0) AccountManager.Instance.AddLoyalty(accountId, AppConfiguration.Instance.Loyalty.DailyLogin); AccountManager.Instance.UpdateDivineClock(accountId, 0, 0); } public void AddOfflineLabor(GameConnection connection, DateTime lastLoginTime, short currentLabor) { var delta = DateTime.UtcNow - lastLoginTime; var ticksToAdd = (int)Math.Floor(delta.TotalMinutes / AppConfiguration.Instance.LaborOffline.TickMinutes); if (ticksToAdd <= 0) return; var addLabor = AppConfiguration.Instance.LaborOffline.GetTickAmount(connection.Payment.PremiumState) * ticksToAdd; DoAddLabor(connection, currentLabor, addLabor); } }