From b66569abbda365fd9ba47fabbf232bf33a61d03c Mon Sep 17 00:00:00 2001 From: Lucca Faria Ferri Date: Sat, 28 Jan 2023 04:39:28 -0800 Subject: [PATCH] Refactoring, new commands, config of chances of unidentified drops (for higher and lower quality items), modified !drop command to don't allow unidentified items, some bug-prevention fixes. --- .../BGS-Server/AccountsSystem/Account.cs | 112 +- .../AccountsSystem/AccountManager.cs | 2 +- .../BGS-Server/AccountsSystem/GameAccount.cs | 3278 ++++++++--------- .../AccountsSystem/GameAccountManager.cs | 4 +- .../BGS-Server/Crypthography/SRP6a.cs | 10 +- .../Services/AuthenticationService.cs | 30 +- .../Services/ChannelInvitationService.cs | 16 +- .../Services/ChannelMembershipService.cs | 2 +- .../Services/ChannelOwnerService.cs | 18 +- .../ServicesSystem/Services/ChannelService.cs | 12 +- .../Services/ConnectionSerivce.cs | 6 +- .../ServicesSystem/Services/FriendService.cs | 14 +- .../Services/GameRequestService.cs | 4 +- .../Services/GameUtilitiesService.cs | 2792 +++++++++----- .../Services/NotificationService.cs | 8 +- .../Services/PresenceService.cs | 12 +- .../Services/ResourceService.cs | 2 +- .../ServicesSystem/Services/SessionService.cs | 29 +- .../Services/UserManagerService.cs | 10 +- src/DiIiS-NA/BGS-Server/Toons/Toon.cs | 362 +- src/DiIiS-NA/Core/Logging/AnsiTarget.cs | 4 +- .../AchievementSystem/AchievementManager.cs | 85 +- .../CommandManager/GameCommands.cs | 72 +- src/DiIiS-NA/D3-GameServer/Config.cs | 95 +- .../GSSystem/AISystem/Brains/MonsterBrain.cs | 2 +- .../GSSystem/ActorSystem/Actor.cs | 2 +- .../Implementations/Hirelings/Hireling.cs | 2 +- .../ActorSystem/Implementations/Kadala.cs | 2 +- .../D3-GameServer/GSSystem/GameSystem/Game.cs | 2 + .../GSSystem/ItemsSystem/ItemGenerator.cs | 45 +- .../D3-GameServer/GSSystem/MapSystem/World.cs | 7 +- .../GSSystem/PlayerSystem/Inventory.cs | 2 +- .../GSSystem/PlayerSystem/Player.cs | 190 +- .../PowerSystem/Payloads/DeathPayload.cs | 2 +- .../GSSystem/QuestSystem/Events.cs | 10 +- src/DiIiS-NA/Program.cs | 2 +- 36 files changed, 3919 insertions(+), 3328 deletions(-) diff --git a/src/DiIiS-NA/BGS-Server/AccountsSystem/Account.cs b/src/DiIiS-NA/BGS-Server/AccountsSystem/Account.cs index 97d0fd6..fa93439 100644 --- a/src/DiIiS-NA/BGS-Server/AccountsSystem/Account.cs +++ b/src/DiIiS-NA/BGS-Server/AccountsSystem/Account.cs @@ -17,14 +17,8 @@ namespace DiIiS_NA.LoginServer.AccountsSystem private DBAccount _dbAccount = null; //may be cached forever, as only MooNetServer changes it public DBAccount DBAccount { - get - { - return _dbAccount; - } - set - { - _dbAccount = value; - } + get => _dbAccount; + set => _dbAccount = value; } //public D3.PartyMessage.ScreenStatus ScreenStatus { get; set; } @@ -54,13 +48,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem } } - public StringPresenceField RealIDTagField - { - get - { - return new StringPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.Account, 1, 0, string.Format("")); - } - } + public StringPresenceField RealIDTagField => new(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.Account, 1, 0, string.Format("")); public BoolPresenceField AccountOnlineField @@ -123,34 +111,21 @@ namespace DiIiS_NA.LoginServer.AccountsSystem public bool IsOnline { - get - { + get => //check if gameAccount is online - return GameAccount.IsOnline; - } - set - { - GameAccount.IsOnline = value; - } + GameAccount.IsOnline; + set => GameAccount.IsOnline = value; } - public List FriendsIds = new List(); + public List FriendsIds = new(); - public List IgnoreIds = new List(); + public List IgnoreIds = new(); + + public string Email => DBAccount.Email; - public string Email - { - get - { - return DBAccount.Email; - } - private set - { - } - } public string SaltedTicket { - get { return DBAccount.SaltedTicket; } + get => DBAccount.SaltedTicket; internal set { DBAccount.SaltedTicket = value; @@ -159,38 +134,38 @@ namespace DiIiS_NA.LoginServer.AccountsSystem } public byte[] Salt { - get { return DBAccount.Salt.ToArray(); } + get => DBAccount.Salt.ToArray(); internal set { DBAccount.Salt = value; DBSessions.SessionUpdate(DBAccount); } } // s- User's salt. - public byte[] FullSalt - { - get { return DBAccount.Salt.ToArray(); } - } // s- User's salt. + public byte[] FullSalt => DBAccount.Salt.ToArray(); // s- User's salt. public byte[] PasswordVerifier { - get { return DBAccount.PasswordVerifier; } + get => DBAccount.PasswordVerifier; internal set { - DBAccount.PasswordVerifier = value; - DBSessions.SessionUpdate(DBAccount); + lock (DBAccount) + { + DBAccount.PasswordVerifier = value; + DBSessions.SessionUpdate(DBAccount); + } } - } // v - password verifier. + } public int HashCode { - get - { - return DBAccount.HashCode; - } + get => DBAccount.HashCode; private set { - DBAccount.HashCode = value; - DBSessions.SessionUpdate(DBAccount); + lock (DBAccount) + { + DBAccount.HashCode = value; + DBSessions.SessionUpdate(DBAccount); + } } } @@ -242,7 +217,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem public UserLevels UserLevel { - get { return DBAccount.UserLevel; } + get => DBAccount.UserLevel; internal set { DBAccount.UserLevel = value; @@ -275,13 +250,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem public static readonly D3.OnlineService.EntityId AccountHasNoToons = D3.OnlineService.EntityId.CreateBuilder().SetIdHigh(0).SetIdLow(0).Build(); - public D3.OnlineService.EntityId LastSelectedGameAccount - { - get - { - return GameAccount.D3GameAccountId; - } - } + public D3.OnlineService.EntityId LastSelectedGameAccount => GameAccount.D3GameAccountId; public string BroadcastMessage = ""; @@ -322,7 +291,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem DoClear(operation.Field); break; default: - Logger.Warn("No operation type."); + Logger.Warn($"No operation type in $[olive]${nameof(Account)}.{nameof(Update)}(IList)$[/]."); break; } } @@ -407,7 +376,8 @@ namespace DiIiS_NA.LoginServer.AccountsSystem } else { - Logger.Warn("Account Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group, queryKey.Field); + Logger.Warn( + $"Account Unknown query-key: $[underline yellow]${queryKey.Program}$[/]$, $[underline yellow]${queryKey.Group}$[/]$, $[underline yellow]${queryKey.Field}$[/]$"); } break; case FieldKeyHelper.Program.BNet: @@ -421,7 +391,8 @@ namespace DiIiS_NA.LoginServer.AccountsSystem } else { - Logger.Warn("Account Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group, queryKey.Field); + Logger.Warn( + $"Account Unknown query-key: $[underline yellow]${queryKey.Program}$[/]$, $[underline yellow]${queryKey.Group}$[/]$, $[underline yellow]${queryKey.Field}$[/]$"); } break; } @@ -459,7 +430,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem var operationList = new List(); //if (this.LastSelectedHero != AccountHasNoToons) //operationList.Add(this.LastPlayedHeroIdField.GetFieldOperation()); - if (LastSelectedGameAccount != AccountHasNoToons) + if (!Equals(LastSelectedGameAccount, AccountHasNoToons)) { operationList.Add(LastPlayedToonIdField.GetFieldOperation()); operationList.Add(LastPlayedGameAccountIdField.GetFieldOperation()); @@ -477,21 +448,10 @@ namespace DiIiS_NA.LoginServer.AccountsSystem #endregion - public bool VerifyPassword(string password) - { - if (string.IsNullOrEmpty(password)) - return false; - - if (password.Length < 8 || password.Length > 16) - return false; - - var calculatedVerifier = SRP6a.CalculatePasswordVerifierForAccount(Email, password, FullSalt); - return calculatedVerifier.SequenceEqual(PasswordVerifier); - } - + public override string ToString() { - return String.Format("{{ Account: {0} [lowId: {1}] }}", Email, BnetEntityId.Low); + return $"{{ Account: {Email} [lowId: {BnetEntityId.Low}] }}"; } /// diff --git a/src/DiIiS-NA/BGS-Server/AccountsSystem/AccountManager.cs b/src/DiIiS-NA/BGS-Server/AccountsSystem/AccountManager.cs index 8776041..4d5c7a7 100644 --- a/src/DiIiS-NA/BGS-Server/AccountsSystem/AccountManager.cs +++ b/src/DiIiS-NA/BGS-Server/AccountsSystem/AccountManager.cs @@ -22,7 +22,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem public static int TotalAccounts => DBSessions.SessionQuery().Count(); - public static readonly ConcurrentDictionary LoadedAccounts = new ConcurrentDictionary(); + public static readonly ConcurrentDictionary LoadedAccounts = new(); public static void PreLoadAccounts() { diff --git a/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccount.cs b/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccount.cs index abb98a4..6e3642c 100644 --- a/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccount.cs +++ b/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccount.cs @@ -1,5 +1,6 @@ //Blizzless Project 2022 //Blizzless Project 2022 + using System; //Blizzless Project 2022 using System.Collections.Generic; @@ -42,1730 +43,1555 @@ using DiIiS_NA.LoginServer.Toons; //Blizzless Project 2022 using Google.ProtocolBuffers; -namespace DiIiS_NA.LoginServer.AccountsSystem +namespace DiIiS_NA.LoginServer.AccountsSystem; + +public class GameAccount : PersistentRPCObject { - public class GameAccount : PersistentRPCObject - { - private Account _owner; - - public Account Owner - { - get - { - if (_owner == null) - _owner = AccountManager.GetAccountByPersistentID(AccountId); - return _owner; - } - set - { - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.DBAccount = value.DBAccount; - DBSessions.SessionUpdate(dbGAcc); - } - } - } - - public ulong AccountId = 0; - - public DBGameAccount DBGameAccount - { - get - { - return DBSessions.SessionGet(PersistentID); - } - set { } - } - - public EntityId D3GameAccountId - { - get - { - return EntityId.CreateBuilder().SetIdHigh(BnetEntityId.High).SetIdLow(PersistentID).Build(); - } - } - - public ByteStringPresenceField BannerConfigurationField - { - get - { - return new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 1, 0, BannerConfiguration); - } - } - - - public ByteStringPresenceField LastPlayedHeroIdField - { - get - { - var val = new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 2, 0) - { - Value = LastPlayedHeroId - }; - return val; - } - } - - public IntPresenceField ActivityField - { - get - { - return new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 3, 0, CurrentActivity); - } - } - - public ByteStringPresenceField ClanIdField - { - get - { - var val = new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 7, 0); - val.Value = Clan.Summary; - return val; - } - } - - public StringPresenceField GameVersionField - { - get - { - return new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 11, 0, "2.7.1.22044"); - } - } - - - public EntityId LastPlayedHeroId - { - get - { - if (CurrentToon == null) - return Toons.Count > 0 ? Toons.First().D3EntityID : AccountHasNoToons; - return CurrentToon.D3EntityID; - } - } - - public ByteStringPresenceField PartyIdField - { - get - { - var val = new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 1, 0) - { - Value = PartyChannelId - }; - return val; - } - } - /* - public ByteStringPresenceField PartyIdField - { - get - { - var val = new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 1, 0) - { - Value = PartyId - }; - return val; - } - } - //*/ - - public bgs.protocol.channel.v1.ChannelId PartyChannelId - { - get - { - if (LoggedInClient != null && LoggedInClient.CurrentChannel != null) - { - return bgs.protocol.channel.v1.ChannelId.CreateBuilder() - .SetType(0) - .SetId((uint)LoggedInClient.CurrentChannel.D3EntityId.IdLow) - .SetHost(bgs.protocol.ProcessId.CreateBuilder().SetLabel(1).SetEpoch(0)) - .Build(); - } - else - return null; - } - set - { - if (value != null) - LoggedInClient.CurrentChannel = ChannelManager.GetChannelByChannelId (value); - } - } - - public EntityId PartyId - { - get - { - if (LoggedInClient != null && LoggedInClient.CurrentChannel != null) - { - return LoggedInClient.CurrentChannel.D3EntityId; - } - else - return null; - } - set - { - if (value != null) - LoggedInClient.CurrentChannel = ChannelManager.GetChannelByEntityId(value); - } - } - - public IntPresenceField JoinPermissionField - = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 2, 0); - - public FourCCPresenceField ProgramField - = new FourCCPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 3, 0); - - public StringPresenceField CallToArmsField - { - get - { - return new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 3, 0, Owner.BattleTagName); - } - } - - public StringPresenceField BattleTagField - { - get - { - return new StringPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 5, 0, Owner.BattleTag); - } - } - - public StringPresenceField GameAccountNameField - { - get - { - return new StringPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 6, 0, Owner.BnetEntityId.Low.ToString() + "#1"); - } - } - - public EntityIdPresenceField OwnerIdField - { - get - { - var val = new EntityIdPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 7, 0); - val.Value = Owner.BnetEntityId; - return val; - } - } - - public BoolPresenceField GameAccountStatusField = new BoolPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 1, 0, false); - - public int _currentActivity = 0; - - public int CurrentActivity - { - get { return _currentActivity; } - set - { - _currentActivity = value; - ChangedFields.SetPresenceFieldValue(ActivityField); - } - } - - - public IntPresenceField LastOnlineField - { - get - { - return new IntPresenceField(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 4, 0, (long)LastOnline); - } - } - - public ulong LastOnline = 1; - - public FieldKeyHelper.Program Program; - - - public BannerConfiguration BannerConfiguration - { - get - { - if (_bannerConfiguration != null) - return _bannerConfiguration; - var res = BannerConfiguration.CreateBuilder(); - if (DBGameAccount.Banner == null || DBGameAccount.Banner.Length < 1) - { - res = BannerConfiguration.CreateBuilder() - .SetBannerShape(189701627) - .SetSigilMain(1494901005) - .SetSigilAccent(3399297034) - .SetPatternColor(1797588777) - .SetBackgroundColor(1797588777) - .SetSigilColor(2045456409) - .SetSigilPlacement(1015980604) - .SetPattern(4173846786) - .SetUseSigilVariant(true); - //.SetEpicBanner((uint)StringHashHelper.HashNormal("Banner_Epic_02_Class_Completion")) - //.SetEpicBanner((uint)StringHashHelper.HashNormal("Banner_Epic_03_PVP_Class_Completion")) - //.SetEpicBanner((uint)StringHashHelper.HashNormal("Banner_Epic_01_Hardcore")) - - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.Banner = res.Build().ToByteArray(); - DBSessions.SessionUpdate(dbGAcc); - } - } - else - res = BannerConfiguration.CreateBuilder(BannerConfiguration.ParseFrom(DBGameAccount.Banner)); - - _bannerConfiguration = res.Build(); - return _bannerConfiguration; - } - set - { - _bannerConfiguration = value; - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.Banner = value.ToByteArray(); - DBSessions.SessionUpdate(dbGAcc); - } - - ChangedFields.SetPresenceFieldValue(BannerConfigurationField); - } - } - - private BannerConfiguration _bannerConfiguration; - - private ScreenStatus _screenstatus = ScreenStatus.CreateBuilder().SetScreen(1).SetStatus(0).Build(); - - public ScreenStatus ScreenStatus - { - get { return _screenstatus; } - set - { - _screenstatus = value; - JoinPermissionField.Value = value.Screen; - ChangedFields.SetPresenceFieldValue(JoinPermissionField); - } - } - - /// - /// Selected toon for current account. - /// - - public string CurrentAHCurrency - { - get - { - if (CurrentToon.IsHardcore) - return "D3_GOLD_HC"; - else - return "D3_GOLD"; - } - set { } - } - public bool Logined = false; - public bool Setted = false; - public Toon CurrentToon - { - get - { - if (_currentToonId == 0) return null; - return ToonManager.GetToonByLowID(_currentToonId); - } - set - { - if (value.GameAccount.PersistentID != PersistentID) return; //just in case... - _currentToonId = value.PersistentID; - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.LastPlayedHero = value.DBToon; - DBSessions.SessionUpdate(dbGAcc); - } - - ChangedFields.SetPresenceFieldValue(LastPlayedHeroIdField); - ChangedFields.SetPresenceFieldValue(value.HeroClassField); - ChangedFields.SetPresenceFieldValue(value.HeroLevelField); - ChangedFields.SetPresenceFieldValue(value.HeroParagonLevelField); - ChangedFields.SetPresenceFieldValue(value.HeroVisualEquipmentField); - ChangedFields.SetPresenceFieldValue(value.HeroFlagsField); - ChangedFields.SetPresenceFieldValue(value.HeroNameField); - ChangedFields.SetPresenceFieldValue(value.HighestUnlockedAct); - ChangedFields.SetPresenceFieldValue(value.HighestUnlockedDifficulty); - } - } - - private ulong _currentToonId = 0; - - public ulong Gold { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardcoreGold; - } - else { - return this.DBGameAccount.Gold; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardcoreGold = value; - } - else { - dbGA.Gold = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int BloodShards { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardcoreBloodShards; - } - else { - return this.DBGameAccount.BloodShards; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardcoreBloodShards = value; - } - else { - dbGA.BloodShards = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int TotalBloodShards { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardTotalBloodShards; - } - else { - return this.DBGameAccount.TotalBloodShards; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardTotalBloodShards = value; - } - else { - dbGA.TotalBloodShards = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int StashSize { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardcoreStashSize; - } - else { - return this.DBGameAccount.StashSize; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardcoreStashSize = value; - } - else { - dbGA.StashSize = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int SeasonStashSize { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardSeasonStashSize; - } - else { - return this.DBGameAccount.SeasonStashSize; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardSeasonStashSize = value; - } - else { - dbGA.SeasonStashSize = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public ulong PvPTotalKilled { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardPvPTotalKilled; - } - else { - return this.DBGameAccount.PvPTotalKilled; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardPvPTotalKilled = value; - } - else { - dbGA.PvPTotalKilled = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public ulong PvPTotalWins { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardPvPTotalWins; - } - else { - return this.DBGameAccount.PvPTotalWins; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardPvPTotalWins = value; - } - else { - dbGA.PvPTotalWins = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public ulong PvPTotalGold { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardPvPTotalGold; - } - else { - return this.DBGameAccount.PvPTotalGold; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardPvPTotalGold = value; - } - else { - dbGA.PvPTotalGold = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int CraftItem1 { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardCraftItem1; - } - else { - return this.DBGameAccount.CraftItem1; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardCraftItem1 = value; - } - else { - dbGA.CraftItem1 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int CraftItem2 { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardCraftItem2; - } - else { - return this.DBGameAccount.CraftItem2; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardCraftItem2 = value; - } - else { - dbGA.CraftItem2 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int CraftItem3 { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardCraftItem3; - } - else { - return this.DBGameAccount.CraftItem3; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardCraftItem3 = value; - } - else { - dbGA.CraftItem3 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int CraftItem4 { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardCraftItem4; - } - else { - return this.DBGameAccount.CraftItem4; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardCraftItem4 = value; - } - else { - dbGA.CraftItem4 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int CraftItem5 { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardCraftItem5; - } - else { - return this.DBGameAccount.CraftItem5; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardCraftItem5 = value; - } - else { - dbGA.CraftItem5 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int BigPortalKey { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardBigPortalKey; - } - else { - return this.DBGameAccount.BigPortalKey; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardBigPortalKey = value; - } - else { - dbGA.BigPortalKey = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int LeorikKey { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardLeorikKey; - } - else { - return this.DBGameAccount.LeorikKey; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardLeorikKey = value; - } - else { - dbGA.LeorikKey = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int VialofPutridness { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardVialofPutridness; - } - else { - return this.DBGameAccount.VialofPutridness; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardVialofPutridness = value; - } - else { - dbGA.VialofPutridness = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int IdolofTerror { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardIdolofTerror; - } - else { - return this.DBGameAccount.IdolofTerror; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardIdolofTerror = value; - } - else { - dbGA.IdolofTerror = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int HeartofFright { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardHeartofFright; - } - else { - return this.DBGameAccount.HeartofFright; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardHeartofFright = value; - } - else { - dbGA.HeartofFright = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int HoradricA1Res { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardHoradricA1; - } - else { - return this.DBGameAccount.HoradricA1; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardHoradricA1 = value; - } - else { - dbGA.HoradricA1 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int HoradricA2Res { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardHoradricA2; - } - else { - return this.DBGameAccount.HoradricA2; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardHoradricA2 = value; - } - else { - dbGA.HoradricA2 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int HoradricA3Res { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardHoradricA3; - } - else { - return this.DBGameAccount.HoradricA3; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardHoradricA3 = value; - } - else { - dbGA.HoradricA3 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int HoradricA4Res { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardHoradricA4; - } - else { - return this.DBGameAccount.HoradricA4; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardHoradricA4 = value; - } - else { - dbGA.HoradricA4 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public int HoradricA5Res { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardHoradricA5; - } - else { - return this.DBGameAccount.HoradricA5; - } - } - set { - var dbGA = this.DBGameAccount; - lock (dbGA) { - if (this.CurrentToon.IsHardcore) { - dbGA.HardHoradricA5 = value; - } - else { - dbGA.HoradricA5 = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public Guild Clan - { - get - { - return GuildManager.GetClans().Where(g => g.HasMember(this)).FirstOrDefault(); - } - } - public List Communities - { - get - { - return GuildManager.GetCommunities().Where(g => g.HasMember(this)).ToList(); - } - } - - public List GuildInvites = new List(); - - public GameAccountSettings Settings - { - get - { - GameAccountSettings res = null; - if (DBGameAccount.UISettings == null || DBGameAccount.UISettings.Length < 1) - { - res = GameAccountSettings.CreateBuilder() - //.SetChatFontSize(8) - .SetRmtPreferredCurrency("USD") - .SetRmtLastUsedCurrency("D3_GOLD") - .AddAutoJoinChannelsDeprecated("D3_GeneralChat") - .Build(); - - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.UISettings = res.ToByteArray(); - DBSessions.SessionUpdate(dbGAcc); - } - } - else - res = GameAccountSettings.ParseFrom(DBGameAccount.UISettings); - - return res; - } - set - { - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.UISettings = value.ToByteArray(); - DBSessions.SessionUpdate(dbGAcc); - } - - ChangedFields.SetPresenceFieldValue(BannerConfigurationField); - } - } - - public Preferences Preferences - { - get - { - Preferences res = null; - if (DBGameAccount.UIPrefs == null || DBGameAccount.UIPrefs.Length < 1) - { - res = Preferences.CreateBuilder() - .SetVersion(43) - //.SetFlags2(0x7FFFFFFF) - //.SetActionBindingWorldmap(D3.Client.ActionBinding.CreateBuilder().SetKey1(48).SetKey2(-1).SetKeyModifierFlags1(0).SetKeyModifierFlags2(0).Build()) - //.SetActionBindingConsole(D3.Client.ActionBinding.CreateBuilder().SetKey1(48).SetKey2(-1).SetKeyModifierFlags1(0).SetKeyModifierFlags2(0).Build()) - //.SetActionBindingVoiceptt(D3.Client.ActionBinding.CreateBuilder().SetKey1(112).SetKey2(-1).SetKeyModifierFlags1(0).SetKeyModifierFlags2(0).Build()) - .Build(); - - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.UIPrefs = res.ToByteArray(); - DBSessions.SessionUpdate(dbGAcc); - } - } - else - res = Preferences.ParseFrom(DBGameAccount.UIPrefs); - - return res; - } - set - { - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.UIPrefs = value.ToByteArray(); - DBSessions.SessionUpdate(dbGAcc); - } - - ChangedFields.SetPresenceFieldValue(BannerConfigurationField); - } - } - - /// - /// Away status - /// - public AwayStatusFlag AwayStatus { get; private set; } - - private List _achievements = null; - private List _criteria = null; - - public List Achievements - { - get - { - if (_achievements == null) - SetField(); - return _achievements; - } - set - { - _achievements = value; - } - } - - public List AchievementCriteria - { - get - { - if (_criteria == null) - SetField(); - return _criteria; - } - set - { - _criteria = value; - } - } - - private ClassInfo GetClassInfo(ToonClass className) - { - uint playtime = 0; - uint highestLevel = 1; - var _toons = DBSessions.SessionQueryWhere( - dbi => - dbi.DBGameAccount.Id == PersistentID - && dbi.Class == className).ToList(); - foreach (var toon in _toons) - { - playtime += (uint)toon.TimePlayed; - if (highestLevel < toon.Level) highestLevel = toon.Level; - } - return ClassInfo.CreateBuilder() - .SetPlaytime(playtime) - .SetHighestLevel(highestLevel) - //deprecated //.SetHighestDifficulty(highestDifficulty) - .Build(); - } - - private uint GetHighestHardcoreLevel() - { - uint highestLevel = 0; - var _toons = DBSessions.SessionQueryWhere( - dbi => - dbi.DBGameAccount.Id == PersistentID - && dbi.isHardcore == true).ToList(); - foreach (var toon in _toons) - { - if (highestLevel < toon.Level) highestLevel = toon.Level; - } - return highestLevel; - } - - public bool InviteToGuild(Guild guild, GameAccount inviter) - { - if (guild.IsClan && Clan != null) - return false; - else - { - var invite = D3.Guild.InviteInfo.CreateBuilder() - .SetGuildId(guild.PersistentId) - .SetGuildName(guild.Name) - .SetInviterId(inviter.PersistentID) - .SetCategory(guild.Category) - .SetInviteType(inviter.PersistentID == PersistentID ? 1U : 0U) - .SetExpireTime(3600); - if (guild.IsClan) invite.SetGuildTag(guild.Prefix); - GuildInvites.Add(invite.Build()); - - - var update = D3.Notification.GuildInvitesListUpdate.CreateBuilder(); - update.SetIsRemoved(false).SetGuildId(guild.PersistentId).SetInvite(invite); - - var notification = bgs.protocol.notification.v1.Notification.CreateBuilder(); - notification.SetSenderId(bgs.protocol.EntityId.CreateBuilder().SetHigh(0UL).SetLow(0UL)); - notification.SetTargetAccountId(Owner.BnetEntityId); - notification.SetTargetId(BnetEntityId); - notification.SetType("D3.NotificationMessage"); - notification.AddAttribute(bgs.protocol.Attribute.CreateBuilder() - .SetName("D3.NotificationMessage.MessageId").SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(0))); - notification.AddAttribute(bgs.protocol.Attribute.CreateBuilder() - .SetName("D3.NotificationMessage.Payload").SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(update.Build().ToByteString()))); - - LoggedInClient.MakeRPC((lid) => - bgs.protocol.notification.v1.NotificationListener.CreateStub(LoggedInClient).OnNotificationReceived(new HandlerController() { ListenerId = lid - }, notification.Build(), callback => { })); - return true; - } - } - - public AccountProfile Profile - { - get - { - var dbGAcc = DBGameAccount; - var profile = AccountProfile.CreateBuilder() - .SetParagonLevel((uint)dbGAcc.ParagonLevel) - .SetDeprecatedBestLadderParagonLevel((uint)dbGAcc.ParagonLevel) - .SetParagonLevelHardcore((uint)dbGAcc.ParagonLevelHardcore) - .SetBloodShardsCollected((uint)dbGAcc.TotalBloodShards) - .SetSeasonId(1) - .AddSeasons(1) - //deprecated //.SetHighestDifficulty(Convert.ToUInt32(progress[0], 10)) - .SetNumFallenHeroes(3) - .SetParagonLevelHardcore(0) // Hardcore Paragon Level - .SetBountiesCompleted((uint)dbGAcc.TotalBounties) // Executed orders - .SetLootRunsCompleted(0) // Closed by the Nephalemic Portals - .SetPvpWins(0) - .SetPvpTakedowns(0) - .SetPvpDamage(0) - .SetMonstersKilled(dbGAcc.TotalKilled) // Killed monsters - .SetElitesKilled(dbGAcc.ElitesKilled) // Special Enemies Killed - .SetGoldCollected(dbGAcc.TotalGold) // Collected gold - .SetHighestHardcoreLevel(0) // Maximum level in hermetic mode - .SetHardcoreMonstersKilled(0) // Killed monsters in ger mode - .SetHighestHardcoreLevel(GetHighestHardcoreLevel()) - .SetClassBarbarian(GetClassInfo(ToonClass.Barbarian)) - .SetClassCrusader(GetClassInfo(ToonClass.Crusader)) - .SetClassDemonhunter(GetClassInfo(ToonClass.DemonHunter)) - .SetClassMonk(GetClassInfo(ToonClass.Monk)) - .SetClassWitchdoctor(GetClassInfo(ToonClass.WitchDoctor)) - .SetClassWizard(GetClassInfo(ToonClass.Wizard)) - .SetClassNecromancer(GetClassInfo(ToonClass.Necromancer)); - - - if (dbGAcc.BossProgress[0] != 0xff) profile.SetHighestBossDifficulty1(dbGAcc.BossProgress[0]); - if (dbGAcc.BossProgress[1] != 0xff) profile.SetHighestBossDifficulty2(dbGAcc.BossProgress[1]); - if (dbGAcc.BossProgress[2] != 0xff) profile.SetHighestBossDifficulty3(dbGAcc.BossProgress[2]); - if (dbGAcc.BossProgress[3] != 0xff) profile.SetHighestBossDifficulty4(dbGAcc.BossProgress[3]); - if (dbGAcc.BossProgress[4] != 0xff) profile.SetHighestBossDifficulty5(dbGAcc.BossProgress[4]); - foreach (var hero in Toons) - { - profile.AddHeroes(HeroMiniProfile.CreateBuilder() - .SetHeroName(hero.Name) - .SetHeroGbidClass((int)hero.ClassID) - .SetHeroFlags((uint)hero.Flags) - .SetHeroId((uint)hero.D3EntityID.IdLow) - .SetHeroLevel(hero.Level) - .SetHeroVisualEquipment(hero.HeroVisualEquipmentField.Value) - ); - } - profile.SetNumFallenHeroes(1); - - return profile.Build(); - - //*/ - } - } - - public static readonly EntityId AccountHasNoToons = - EntityId.CreateBuilder().SetIdHigh(0).SetIdLow(0).Build(); - - //Platinum - public int Platinum { - get { - if (this.CurrentToon.IsHardcore) { - return this.DBGameAccount.HardPlatinum; - } - else { - return this.DBGameAccount.Platinum; - } - } - set { - lock (this.DBGameAccount) { - var dbGA = this.DBGameAccount; - if (this.CurrentToon.IsHardcore) { - dbGA.HardPlatinum = value; - } - else { - dbGA.Platinum = value; - } - DBSessions.SessionUpdate(dbGA); - } - } - } - - public List Toons - { - get { return ToonManager.GetToonsForGameAccount(this); } - } - - public GameAccount(DBGameAccount dbGameAccount, List achs = null) - : base(dbGameAccount.Id) - { - //DBGameAccount = dbGameAccount; - AccountId = dbGameAccount.DBAccount.Id; - if (dbGameAccount.LastPlayedHero != null) - _currentToonId = dbGameAccount.LastPlayedHero.Id; - LastOnline = dbGameAccount.LastOnline; - var banner = BannerConfiguration; //just pre-loading it - - const ulong bnetGameAccountHigh = ((ulong)EntityIdHelper.HighIdType.GameAccountId) + (0x0100004433);// + (0x0100004433); - - BnetEntityId = bgs.protocol.EntityId.CreateBuilder().SetHigh(bnetGameAccountHigh).SetLow(PersistentID).Build(); - ProgramField.Value = "D3"; - } - - private void SetField() - { - Achievements = new List(); - AchievementCriteria = new List(); - - var achs = DBSessions.SessionQueryWhere(dbi => dbi.DBGameAccount.Id == PersistentID).ToList(); - foreach (var ach in achs) - { - if (ach.AchievementId == 1) - { - ; - uint countOfTravels = 0; - foreach (var criteria in GameServer.AchievementSystem.AchievementManager.UnserializeBytes(ach.Criteria)) - { - if (criteria == 3367569) - countOfTravels++; - } - AchievementCriteria.Add(CriteriaUpdateRecord.CreateBuilder() - .SetCriteriaId32AndFlags8(3367569) - .SetQuantity32(countOfTravels) - .Build() - ); - } - else - { - if (ach.CompleteTime != -1) - Achievements.Add(AchievementUpdateRecord.CreateBuilder() - .SetAchievementId(ach.AchievementId)//74987243307105) - .SetCompletion(ach.CompleteTime)//1476016727) - .Build() - ); - - if (GameServer.AchievementSystem.AchievementManager.UnserializeBytes(ach.Criteria).Count > 0 && ach.CompleteTime == -1) - foreach (var criteria in GameServer.AchievementSystem.AchievementManager.UnserializeBytes(ach.Criteria)) - AchievementCriteria.Add(CriteriaUpdateRecord.CreateBuilder() - .SetCriteriaId32AndFlags8(criteria) - .SetQuantity32(1) - .Build() - ); - - if (ach.Quantity > 0 && ach.CompleteTime == -1) - AchievementCriteria.Add(CriteriaUpdateRecord.CreateBuilder() - .SetCriteriaId32AndFlags8((uint)GameServer.AchievementSystem.AchievementManager.GetMainCriteria(ach.AchievementId)) - .SetQuantity32((uint)ach.Quantity) - .Build() - ); - } - } - } - - public bool IsOnline - { - get { return LoggedInClient != null; } - set { } - } - - private BattleClient _loggedInClient; - - public BattleClient LoggedInClient - { - get { return _loggedInClient; } - set - { - _loggedInClient = value; - - GameAccountStatusField.Value = IsOnline; - - ulong current_time = (ulong)DateTime.Now.ToExtendedEpoch(); - - - //checking last online - var dbAcc = Owner.DBAccount; - - ChangedFields.SetPresenceFieldValue(GameAccountStatusField); - ChangedFields.SetPresenceFieldValue(LastOnlineField); - ChangedFields.SetPresenceFieldValue(BannerConfigurationField); - - //TODO: Remove this set once delegate for set is added to presence field - //this.Owner.AccountOnlineField.Value = this.Owner.IsOnline; - //var operation = this.Owner.AccountOnlineField.GetFieldOperation(); - try - { - NotifyUpdate(); - } - catch { } - //this.UpdateSubscribers(this.Subscribers, new List() { operation }); - } - } - - /// - /// GameAccount's flags. - /// - public GameAccountFlags Flags - { - get - { - return (GameAccountFlags)DBGameAccount.Flags | GameAccountFlags.HardcoreAdventureModeUnlocked; - } - set - { - lock (DBGameAccount) - { - var dbGAcc = DBGameAccount; - dbGAcc.Flags = (int)value; - DBSessions.SessionUpdate(dbGAcc); - } - } - } - - public Digest Digest - { - get - { - Digest.Builder builder = Digest.CreateBuilder().SetVersion(116) - // 7447=>99, 7728=> 100, 8801=>102, 8296=>105, 8610=>106, 8815=>106, 8896=>106, 9183=>107 - .SetBannerConfiguration(BannerConfiguration) - //.SetFlags((uint)this.Flags) //1 - Enable Hardcore - .SetFlags((uint)114) - .SetLastPlayedHeroId(LastPlayedHeroId) - .SetRebirthsUsed(0) - .SetStashTabsRewardedFromSeasons(1) - .SetSeasonId(1) - .SetCompletedSoloRift(false) - .SetChallengeRiftAccountData(D3.ChallengeRifts.AccountData.CreateBuilder() - .SetLastChallengeRewardEarned(416175).SetLastChallengeTried(416175) - ) - .AddAltLevels((uint)DBGameAccount.ParagonLevel) - //.AddAltLevels((uint)this.DBGameAccount.ParagonLevelHardcore) - ; - if (Clan != null) - builder.SetGuildId(Clan.PersistentId); - - return builder.Build(); - } - } - - public uint AchievementPoints - { - get - { - return (uint)Achievements.Where(a => a.Completion != -1).Count() * 10U; - } - } - - #region Notifications - - public override void NotifyUpdate() - { - var operations = ChangedFields.GetChangedFieldList(); - ChangedFields.ClearChanged(); - UpdateSubscribers(Subscribers, operations); - } - - public override List GetSubscriptionNotifications() - { - //for now set it here - GameAccountStatusField.Value = IsOnline; - - var operationList = new List(); - - //gameaccount - //D3,GameAccount,1,0 -> D3.DBAccount.BannerConfiguration - //D3,GameAccount,2,0 -> ToonId - //D3,GameAccount,3,0 -> Activity - //D3,Party,1,0 -> PartyId - //D3,Party,2,0 -> JoinPermission - //D3,Hero,1,0 -> Hero Class - //D3,Hero,2,0 -> Hero's current level - //D3,Hero,3,0 -> D3.Hero.VisualEquipment - //D3,Hero,4,0 -> Hero's flags - //D3,Hero,5,0 -> Hero Name - //D3,Hero,6,0 -> HighestUnlockedAct - //D3,Hero,7,0 -> HighestUnlockedDifficulty - //Bnet,GameAccount,1,0 -> GameAccount Online - //Bnet,GameAccount,3,0 -> FourCC = "D3" - //Bnet,GameAccount,4,0 -> Unk Int (0 if GameAccount is Offline) - //Bnet,GameAccount,5,0 -> BattleTag - //Bnet,GameAccount,6,0 -> DBAccount.Low + "#1" - //Bnet,GameAccount,7,0 -> DBAccount.EntityId - operationList.Add(BannerConfigurationField.GetFieldOperation()); - if (LastPlayedHeroId != AccountHasNoToons) - { - operationList.Add(LastPlayedHeroIdField.GetFieldOperation()); - if (CurrentToon != null) - operationList.AddRange(CurrentToon.GetSubscriptionNotifications()); - } - - operationList.Add(GameAccountStatusField.GetFieldOperation()); - operationList.Add(ProgramField.GetFieldOperation()); - operationList.Add(LastOnlineField.GetFieldOperation()); - operationList.Add(BattleTagField.GetFieldOperation()); - operationList.Add(GameAccountNameField.GetFieldOperation()); - operationList.Add(OwnerIdField.GetFieldOperation()); - if (Clan != null) - operationList.Add(ClanIdField.GetFieldOperation()); - operationList.Add(GameVersionField.GetFieldOperation()); - operationList.Add(PartyIdField.GetFieldOperation()); - operationList.Add(JoinPermissionField.GetFieldOperation()); - operationList.Add(CallToArmsField.GetFieldOperation()); - operationList.Add(ActivityField.GetFieldOperation()); - return operationList; - } - - #endregion - - public void Update(IList operations) - { - List operationsToUpdate = new List(); - foreach (var operation in operations) - { - switch (operation.Operation) - { - case FieldOperation.Types.OperationType.SET: - var op_build = DoSet(operation.Field); - if (op_build.HasValue) - { - var new_op = operation.ToBuilder(); - new_op.SetField(op_build); - operationsToUpdate.Add(new_op.Build()); - } - break; - case FieldOperation.Types.OperationType.CLEAR: - DoClear(operation.Field); - break; - default: - Logger.Warn("No operation type."); - break; - } - } - if (operationsToUpdate.Count > 0) - UpdateSubscribers(Subscribers, operationsToUpdate); - } - - public void TestUpdate() - { - var operations = GetSubscriptionNotifications(); - /* - operations.Add( - FieldOperation.CreateBuilder() - .SetOperation(FieldOperation.Types.OperationType.SET) - .SetField( - Field.CreateBuilder() - .SetKey(FieldKey.CreateBuilder().SetGroup(4).SetField(3).SetProgram(17459)) - .SetValue(bgs.protocol.Variant.CreateBuilder().SetStringValue("TExt"))) - .Build() - ); - //*/ - //operations.Add(new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 3, 0, "CallToArms").GetFieldOperation()); - //this.Update(operations); - } - - private Field.Builder DoSet(Field field) - { - FieldOperation.Builder operation = FieldOperation.CreateBuilder(); - - Field.Builder returnField = Field.CreateBuilder().SetKey(field.Key); - if (LoggedInClient == null) return returnField; - - switch ((FieldKeyHelper.Program)field.Key.Program) - { - case FieldKeyHelper.Program.D3: - if (field.Key.Group == 2 && field.Key.Field == 3) //CurrentActivity - { - CurrentActivity = (int)field.Value.IntValue; - returnField.SetValue(field.Value); - Logger.Debug("{0} set CurrentActivity to {1}", this, field.Value.IntValue); - } - else if (field.Key.Group == 2 && field.Key.Field == 4) //Unknown bool - { - returnField.SetValue(field.Value); - Logger.Debug("{0} set CurrentActivity to {1}", this, field.Value.BoolValue); - } - else if (field.Key.Group == 2 && field.Key.Field == 6) //Flags - { - returnField.SetValue(field.Value); - Logger.Debug("{0} set Flags to {1}", this, field.Value.UintValue); - } - else if (field.Key.Group == 2 && field.Key.Field == 8) //? - { - returnField.SetValue(field.Value); - } - else if (field.Key.Group == 2 && field.Key.Field == 11) //Version - { - returnField.SetValue(field.Value); - Logger.Debug("{0} set Version to {1}", this, field.Value.StringValue); - } - else if (field.Key.Group == 4 && field.Key.Field == 1) //PartyId - { - if (field.Value.HasMessageValue) //7727 Sends empty SET instead of a CLEAR -Egris - { - Channel channel = ChannelManager.GetChannelByChannelId(bgs.protocol.channel.v1.ChannelId.ParseFrom(field.Value.MessageValue)); - //this.PartyId = EntityId.CreateBuilder().SetIdLow(NewChannelID.Id).SetIdHigh(0x600000000000000).Build(); - - PartyChannelId = bgs.protocol.channel.v1.ChannelId.ParseFrom(field.Value.MessageValue); - LoggedInClient.CurrentChannel = channel; - var c = bgs.protocol.channel.v1.ChannelId.ParseFrom(field.Value.MessageValue); - //returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); - returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); - //returnField.SetValue(field.Value); - - - - Logger.Debug("{0} set channel to {1}", this, channel); - } - else - { - PartyId = null; - //if(PartyChannelId != null) - // returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); - //else - returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(ByteString.Empty).Build()); - Logger.Debug("Empty-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, field.Key.Field); - } - } - else if (field.Key.Group == 4 && field.Key.Field == 2) //JoinPermission - { - if (ScreenStatus.Screen != field.Value.IntValue) - { - ScreenStatus = ScreenStatus.CreateBuilder().SetScreen((int)field.Value.IntValue).SetStatus(0).Build(); - Logger.Debug("{0} set current screen to {1}.", this, field.Value.IntValue); - } - returnField.SetValue(field.Value); - } - else if (field.Key.Group == 4 && field.Key.Field == 3) //CallToArmsMessage - { - Logger.Debug("CallToArmsMessage: {0}, {1}, {2}", field.Key.Group, field.Key.Field, field.Value); - returnField.SetValue(field.Value); - } - else if (field.Key.Group == 4 && field.Key.Field == 4) //Party IsFull - { - returnField.SetValue(field.Value); - } - else if (field.Key.Group == 5 && field.Key.Field == 5) //Game IsPrivate - { - //returnField.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build()); - returnField.SetValue(field.Value); - Logger.Debug("{0} set Game IsPrivate {1}.", this, field.Value.ToString()); - } - else - { - Logger.Warn("GameAccount: Unknown set-field: {0}, {1}, {2} := {3}", field.Key.Program, - field.Key.Group, field.Key.Field, field.Value); - } - break; - case FieldKeyHelper.Program.BNet: - if (field.Key.Group == 2 && field.Key.Field == 2) // SocialStatus - { - AwayStatus = (AwayStatusFlag)field.Value.IntValue; - returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build()); - Logger.Debug("{0} set AwayStatus to {1}.", this, AwayStatus); - } - else if (field.Key.Group == 2 && field.Key.Field == 8)// RichPresence - { - returnField.SetValue((field.Value)); - } - else if (field.Key.Group == 2 && field.Key.Field == 10) // AFK - { - returnField.SetValue(field.Value); - Logger.Debug("{0} set AFK to {1}.", this, field.Value.BoolValue); - } - else - { - Logger.Warn("GameAccount: Unknown set-field: {0}, {1}, {2} := {3}", field.Key.Program, - field.Key.Group, field.Key.Field, field.Value); - } - break; - } - - //We only update subscribers on fields that actually change values. - return returnField; - } - - private void DoClear(Field field) - { - switch ((FieldKeyHelper.Program)field.Key.Program) - { - case FieldKeyHelper.Program.D3: - Logger.Warn("GameAccount: Unknown clear-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, - field.Key.Field); - break; - case FieldKeyHelper.Program.BNet: - Logger.Warn("GameAccount: Unknown clear-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, - field.Key.Field); - break; - } - } - - public Field QueryField(FieldKey queryKey) - { - Field.Builder field = Field.CreateBuilder().SetKey(queryKey); - - switch ((FieldKeyHelper.Program)queryKey.Program) - { - case FieldKeyHelper.Program.D3: - if (queryKey.Group == 2 && queryKey.Field == 1) // Banner configuration - { - field.SetValue( - bgs.protocol.Variant.CreateBuilder().SetMessageValue(BannerConfigurationField.Value.ToByteString()).Build - ()); - } - else if (queryKey.Group == 2 && queryKey.Field == 2) //Hero's EntityId - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(LastPlayedHeroId.ToByteString()).Build()); - } - else if (queryKey.Group == 2 && queryKey.Field == 4) //Unknown Bool - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(true).Build()); - } - else if (queryKey.Group == 2 && queryKey.Field == 8) - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(true).Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 1) // Hero's class (GbidClass) - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(CurrentToon.ClassID).Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 2) // Hero's current level - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(CurrentToon.Level).Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 3) // Hero's visible equipment - { - field.SetValue( - bgs.protocol.Variant.CreateBuilder().SetMessageValue( - CurrentToon.HeroVisualEquipmentField.Value.ToByteString()).Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 4) // Hero's flags (gender and such) - { - field.SetValue( - bgs.protocol.Variant.CreateBuilder().SetIntValue(/*1073741821*/(uint)(CurrentToon.Flags | ToonFlags.AllUnknowns)). - Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 5) // Toon name - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetStringValue(CurrentToon.Name).Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 6) //highest act - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(400).Build()); - } - else if (queryKey.Group == 3 && queryKey.Field == 7) //highest difficulty - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(9).Build()); - } - else if (queryKey.Group == 4 && queryKey.Field == 1) // Channel ID if the client is online - { - //field.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); - if (PartyId != null) - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyId.ToByteString()).Build()); - else field.SetValue(bgs.protocol.Variant.CreateBuilder().Build()); - } - else if (queryKey.Group == 4 && queryKey.Field == 2) - // Current screen (all known values are just "in-menu"; also see ScreenStatuses sent in ChannelService.UpdateChannelState) - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(ScreenStatus.Screen).Build()); - } - else if (queryKey.Group == 4 && queryKey.Field == 4) //Unknown Bool - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(false).Build()); - } - else - { - Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group, - queryKey.Field); - } - break; - case FieldKeyHelper.Program.BNet: - if (queryKey.Group == 2 && queryKey.Field == 1) //GameAccount Logged in - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(GameAccountStatusField.Value).Build()); - } - else if (queryKey.Group == 2 && queryKey.Field == 2) // Away status - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build()); - } - else if (queryKey.Group == 2 && queryKey.Field == 3) // Program - always D3 - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetFourccValue("D3").Build()); - //field.SetValue(bgs.protocol.Variant.CreateBuilder().SetFourccValue("BNet").Build()); - //BNet = 16974, - //D3 = 17459, - //S2 = 21298, - //WoW = 5730135, - } - else if (queryKey.Group == 2 && queryKey.Field == 5) // BattleTag - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetStringValue(Owner.BattleTag).Build()); - } - else if (queryKey.Group == 2 && queryKey.Field == 7) // DBAccount.EntityId - { - field.SetValue(bgs.protocol.Variant.CreateBuilder().SetEntityIdValue(Owner.BnetEntityId).Build()); - } - else if (queryKey.Group == 2 && queryKey.Field == 10) // AFK - { - field.SetValue( - bgs.protocol.Variant.CreateBuilder().SetBoolValue(AwayStatus != AwayStatusFlag.Available).Build()); - } - else - { - Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group, - queryKey.Field); - } - break; - } - - return field.HasValue ? field.Build() : null; - } - - public override string ToString() - { - return $"{{ GameAccount: {Owner.BattleTag} [lowId: {BnetEntityId.Low}] }}"; - } - - //TODO: figure out what 1 and 3 represent, or if it is a flag since all observed values are powers of 2 so far /dustinconrad - public enum AwayStatusFlag : uint - { - Available = 0x00, - UnknownStatus1 = 0x01, - Away = 0x02, - UnknownStatus2 = 0x03, - Busy = 0x04 - } - - [Flags] - public enum GameAccountFlags : uint - { - None = 0x00, - HardcoreUnlocked = 0x01, - AdventureModeUnlocked = 0x04, - Paragon100 = 0x08, - MasterUnlocked = 0x10, - TormentUnlocked = 0x20, - AdventureModeTutorial = 0x40, - HardcoreMasterUnlocked = 0x80, - HardcoreTormentUnlocked = 0x100, - HardcoreAdventureModeUnlocked = 0x200 - } - } -} + private Account _owner; + + public Account Owner + { + get => _owner ?? (_owner = AccountManager.GetAccountByPersistentID(AccountId)); + set + { + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.DBAccount = value.DBAccount; + DBSessions.SessionUpdate(dbGAcc); + } + } + } + + public ulong AccountId = 0; + + public DBGameAccount DBGameAccount => DBSessions.SessionGet(PersistentID); + + public EntityId D3GameAccountId => + EntityId.CreateBuilder().SetIdHigh(BnetEntityId.High).SetIdLow(PersistentID).Build(); + + public ByteStringPresenceField BannerConfigurationField => new(FieldKeyHelper.Program.D3, + FieldKeyHelper.OriginatingClass.GameAccount, 1, 0, BannerConfiguration); + + + public ByteStringPresenceField LastPlayedHeroIdField => + new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 2, 0) + { + Value = LastPlayedHeroId + }; + + public IntPresenceField ActivityField => new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, + 3, 0, CurrentActivity); + + public ByteStringPresenceField ClanIdField => + new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 7, 0) + { + Value = Clan.Summary + }; + + public StringPresenceField GameVersionField => + new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.GameAccount, 11, 0, + "2.7.4.84161"); // 2.7.1.22044 + + + public EntityId LastPlayedHeroId => + CurrentToon == null + ? Toons.Count > 0 ? Toons.First().D3EntityID : AccountHasNoToons + : CurrentToon.D3EntityID; + + public ByteStringPresenceField PartyIdField => + new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 1, 0) + { + Value = PartyChannelId + }; + /* + public ByteStringPresenceField PartyIdField + { + get + { + var val = new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 1, 0) + { + Value = PartyId + }; + return val; + } + } + //*/ + + public bgs.protocol.channel.v1.ChannelId PartyChannelId + { + get => + LoggedInClient is { CurrentChannel: { } } + ? bgs.protocol.channel.v1.ChannelId.CreateBuilder() + .SetType(0) + .SetId((uint)LoggedInClient.CurrentChannel.D3EntityId.IdLow) + .SetHost(bgs.protocol.ProcessId.CreateBuilder().SetLabel(1).SetEpoch(0)) + .Build() + : null; + set + { + if (value != null) + LoggedInClient.CurrentChannel = ChannelManager.GetChannelByChannelId(value); + } + } + + public EntityId PartyId + { + get => LoggedInClient is { CurrentChannel: { } } ? LoggedInClient.CurrentChannel.D3EntityId : null; + set + { + if (value != null) + LoggedInClient.CurrentChannel = ChannelManager.GetChannelByEntityId(value); + } + } + + public IntPresenceField JoinPermissionField + = new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 2, 0); + + public FourCCPresenceField ProgramField + = new(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 3, 0); + + public StringPresenceField CallToArmsField => new(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, + 3, 0, Owner.BattleTagName); + + public StringPresenceField BattleTagField => new(FieldKeyHelper.Program.BNet, + FieldKeyHelper.OriginatingClass.GameAccount, 5, 0, Owner.BattleTag); + + public StringPresenceField GameAccountNameField => new(FieldKeyHelper.Program.BNet, + FieldKeyHelper.OriginatingClass.GameAccount, 6, 0, Owner.BnetEntityId.Low.ToString() + "#1"); + + public EntityIdPresenceField OwnerIdField + { + get + { + var val = new EntityIdPresenceField(FieldKeyHelper.Program.BNet, + FieldKeyHelper.OriginatingClass.GameAccount, 7, 0); + val.Value = Owner.BnetEntityId; + return val; + } + } + + public BoolPresenceField GameAccountStatusField = + new(FieldKeyHelper.Program.BNet, FieldKeyHelper.OriginatingClass.GameAccount, 1, 0, false); + + public int _currentActivity = 0; + + public int CurrentActivity + { + get => _currentActivity; + set + { + _currentActivity = value; + ChangedFields.SetPresenceFieldValue(ActivityField); + } + } + + + public IntPresenceField LastOnlineField => new(FieldKeyHelper.Program.BNet, + FieldKeyHelper.OriginatingClass.GameAccount, 4, 0, (long)_lastOnline); + + private readonly ulong _lastOnline = 1; + + public FieldKeyHelper.Program Program; + + + public BannerConfiguration BannerConfiguration + { + get + { + if (_bannerConfiguration != null) + return _bannerConfiguration; + var res = BannerConfiguration.CreateBuilder(); + if (DBGameAccount.Banner == null || DBGameAccount.Banner.Length < 1) + { + res = BannerConfiguration.CreateBuilder() + .SetBannerShape(189701627) + .SetSigilMain(1494901005) + .SetSigilAccent(3399297034) + .SetPatternColor(1797588777) + .SetBackgroundColor(1797588777) + .SetSigilColor(2045456409) + .SetSigilPlacement(1015980604) + .SetPattern(4173846786) + .SetUseSigilVariant(true); + //.SetEpicBanner((uint)StringHashHelper.HashNormal("Banner_Epic_02_Class_Completion")) + //.SetEpicBanner((uint)StringHashHelper.HashNormal("Banner_Epic_03_PVP_Class_Completion")) + //.SetEpicBanner((uint)StringHashHelper.HashNormal("Banner_Epic_01_Hardcore")) + + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.Banner = res.Build().ToByteArray(); + DBSessions.SessionUpdate(dbGAcc); + } + } + else + { + res = BannerConfiguration.CreateBuilder(BannerConfiguration.ParseFrom(DBGameAccount.Banner)); + } + + _bannerConfiguration = res.Build(); + return _bannerConfiguration; + } + set + { + _bannerConfiguration = value; + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.Banner = value.ToByteArray(); + DBSessions.SessionUpdate(dbGAcc); + } + + ChangedFields.SetPresenceFieldValue(BannerConfigurationField); + } + } + + private BannerConfiguration _bannerConfiguration; + + private ScreenStatus _screenStatus = ScreenStatus.CreateBuilder().SetScreen(1).SetStatus(0).Build(); + + public ScreenStatus ScreenStatus + { + get => _screenStatus; + set + { + _screenStatus = value; + JoinPermissionField.Value = value.Screen; + ChangedFields.SetPresenceFieldValue(JoinPermissionField); + } + } + + /// + /// Selected toon for current account. + /// + + public string CurrentAHCurrency + { + get => CurrentToon.IsHardcore ? "D3_GOLD_HC" : "D3_GOLD"; + set { } + } + + public Toon CurrentToon + { + get => _currentToonId == 0 ? null : ToonManager.GetToonByLowID(_currentToonId); + set + { + if (value.GameAccount.PersistentID != PersistentID) return; //just in case... + _currentToonId = value.PersistentID; + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.LastPlayedHero = value.DBToon; + DBSessions.SessionUpdate(dbGAcc); + } + + ChangedFields.SetPresenceFieldValue(LastPlayedHeroIdField); + ChangedFields.SetPresenceFieldValue(value.HeroClassField); + ChangedFields.SetPresenceFieldValue(value.HeroLevelField); + ChangedFields.SetPresenceFieldValue(value.HeroParagonLevelField); + ChangedFields.SetPresenceFieldValue(value.HeroVisualEquipmentField); + ChangedFields.SetPresenceFieldValue(value.HeroFlagsField); + ChangedFields.SetPresenceFieldValue(value.HeroNameField); + ChangedFields.SetPresenceFieldValue(value.HighestUnlockedAct); + ChangedFields.SetPresenceFieldValue(value.HighestUnlockedDifficulty); + } + } + + private ulong _currentToonId = 0; + + public ulong Gold + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardcoreGold; + + return DBGameAccount.Gold; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardcoreGold = value; + else + DBGameAccount.Gold = value; + + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int BloodShards + { + get => CurrentToon.IsHardcore ? DBGameAccount.HardcoreBloodShards : DBGameAccount.BloodShards; + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardcoreBloodShards = value; + else + DBGameAccount.BloodShards = value; + + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int TotalBloodShards + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardTotalBloodShards; + + return DBGameAccount.TotalBloodShards; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardTotalBloodShards = value; + else + DBGameAccount.TotalBloodShards = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int StashSize + { + get => CurrentToon.IsHardcore ? DBGameAccount.HardcoreStashSize : DBGameAccount.StashSize; + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardcoreStashSize = value; + else + DBGameAccount.StashSize = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int SeasonStashSize + { + get => CurrentToon.IsHardcore ? DBGameAccount.HardSeasonStashSize : DBGameAccount.SeasonStashSize; + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardSeasonStashSize = value; + else + DBGameAccount.SeasonStashSize = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public ulong PvPTotalKilled + { + get => CurrentToon.IsHardcore ? DBGameAccount.HardPvPTotalKilled : DBGameAccount.PvPTotalKilled; + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardPvPTotalKilled = value; + else + DBGameAccount.PvPTotalKilled = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public ulong PvPTotalWins + { + get => CurrentToon.IsHardcore ? DBGameAccount.HardPvPTotalWins : DBGameAccount.PvPTotalWins; + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardPvPTotalWins = value; + else + DBGameAccount.PvPTotalWins = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public ulong PvPTotalGold + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardPvPTotalGold; + + return DBGameAccount.PvPTotalGold; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardPvPTotalGold = value; + else + DBGameAccount.PvPTotalGold = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int CraftItem1 + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardCraftItem1; + + return DBGameAccount.CraftItem1; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardCraftItem1 = value; + else + DBGameAccount.CraftItem1 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int CraftItem2 + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardCraftItem2; + + return DBGameAccount.CraftItem2; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardCraftItem2 = value; + else + DBGameAccount.CraftItem2 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int CraftItem3 + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardCraftItem3; + + return DBGameAccount.CraftItem3; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardCraftItem3 = value; + else + DBGameAccount.CraftItem3 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int CraftItem4 + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardCraftItem4; + + return DBGameAccount.CraftItem4; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardCraftItem4 = value; + else + DBGameAccount.CraftItem4 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int CraftItem5 + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardCraftItem5; + + return DBGameAccount.CraftItem5; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardCraftItem5 = value; + else + DBGameAccount.CraftItem5 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int BigPortalKey + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardBigPortalKey; + + return DBGameAccount.BigPortalKey; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardBigPortalKey = value; + else + DBGameAccount.BigPortalKey = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int LeorikKey + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardLeorikKey; + + return DBGameAccount.LeorikKey; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardLeorikKey = value; + else + DBGameAccount.LeorikKey = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int VialofPutridness + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardVialofPutridness; + + return DBGameAccount.VialofPutridness; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardVialofPutridness = value; + else + DBGameAccount.VialofPutridness = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int IdolofTerror + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardIdolofTerror; + + return DBGameAccount.IdolofTerror; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardIdolofTerror = value; + else + DBGameAccount.IdolofTerror = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int HeartofFright + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardHeartofFright; + + return DBGameAccount.HeartofFright; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardHeartofFright = value; + else + DBGameAccount.HeartofFright = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int HoradricA1Res + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardHoradricA1; + + return DBGameAccount.HoradricA1; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardHoradricA1 = value; + else + DBGameAccount.HoradricA1 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int HoradricA2Res + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardHoradricA2; + + return DBGameAccount.HoradricA2; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardHoradricA2 = value; + else + DBGameAccount.HoradricA2 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int HoradricA3Res + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardHoradricA3; + + return DBGameAccount.HoradricA3; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardHoradricA3 = value; + else + DBGameAccount.HoradricA3 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int HoradricA4Res + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardHoradricA4; + + return DBGameAccount.HoradricA4; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardHoradricA4 = value; + else + DBGameAccount.HoradricA4 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public int HoradricA5Res + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardHoradricA5; + + return DBGameAccount.HoradricA5; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardHoradricA5 = value; + else + DBGameAccount.HoradricA5 = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public Guild Clan + { + get { return GuildManager.GetClans().Where(g => g.HasMember(this)).FirstOrDefault(); } + } + + public List Communities + { + get { return GuildManager.GetCommunities().Where(g => g.HasMember(this)).ToList(); } + } + + public List GuildInvites = new(); + + public GameAccountSettings Settings + { + get + { + GameAccountSettings res = null; + if (DBGameAccount.UISettings == null || DBGameAccount.UISettings.Length < 1) + { + res = GameAccountSettings.CreateBuilder() + //.SetChatFontSize(8) + .SetRmtPreferredCurrency("USD") + .SetRmtLastUsedCurrency("D3_GOLD") + .AddAutoJoinChannelsDeprecated("D3_GeneralChat") + .Build(); + + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.UISettings = res.ToByteArray(); + DBSessions.SessionUpdate(dbGAcc); + } + } + else + { + res = GameAccountSettings.ParseFrom(DBGameAccount.UISettings); + } + + return res; + } + set + { + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.UISettings = value.ToByteArray(); + DBSessions.SessionUpdate(dbGAcc); + } + + ChangedFields.SetPresenceFieldValue(BannerConfigurationField); + } + } + + public Preferences Preferences + { + get + { + Preferences res = null; + if (DBGameAccount.UIPrefs == null || DBGameAccount.UIPrefs.Length < 1) + { + res = Preferences.CreateBuilder() + .SetVersion(43) + //.SetFlags2(0x7FFFFFFF) + //.SetActionBindingWorldmap(D3.Client.ActionBinding.CreateBuilder().SetKey1(48).SetKey2(-1).SetKeyModifierFlags1(0).SetKeyModifierFlags2(0).Build()) + //.SetActionBindingConsole(D3.Client.ActionBinding.CreateBuilder().SetKey1(48).SetKey2(-1).SetKeyModifierFlags1(0).SetKeyModifierFlags2(0).Build()) + //.SetActionBindingVoiceptt(D3.Client.ActionBinding.CreateBuilder().SetKey1(112).SetKey2(-1).SetKeyModifierFlags1(0).SetKeyModifierFlags2(0).Build()) + .Build(); + + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.UIPrefs = res.ToByteArray(); + DBSessions.SessionUpdate(dbGAcc); + } + } + else + { + res = Preferences.ParseFrom(DBGameAccount.UIPrefs); + } + + return res; + } + set + { + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.UIPrefs = value.ToByteArray(); + DBSessions.SessionUpdate(dbGAcc); + } + + ChangedFields.SetPresenceFieldValue(BannerConfigurationField); + } + } + + /// + /// Away status + /// + public AwayStatusFlag AwayStatus { get; private set; } + + private List _achievements = null; + private List _criteria = null; + + public List Achievements + { + get + { + if (_achievements == null) + SetField(); + return _achievements; + } + set => _achievements = value; + } + + public List AchievementCriteria + { + get + { + if (_criteria == null) + SetField(); + return _criteria; + } + set => _criteria = value; + } + + private ClassInfo GetClassInfo(ToonClass className) + { + uint playtime = 0; + uint highestLevel = 1; + var _toons = DBSessions.SessionQueryWhere( + dbi => + dbi.DBGameAccount.Id == PersistentID + && dbi.Class == className).ToList(); + foreach (var toon in _toons) + { + playtime += (uint)toon.TimePlayed; + if (highestLevel < toon.Level) highestLevel = toon.Level; + } + + return ClassInfo.CreateBuilder() + .SetPlaytime(playtime) + .SetHighestLevel(highestLevel) + //deprecated //.SetHighestDifficulty(highestDifficulty) + .Build(); + } + + private uint GetHighestHardcoreLevel() + { + uint highestLevel = 0; + var _toons = DBSessions.SessionQueryWhere( + dbi => + dbi.DBGameAccount.Id == PersistentID + && dbi.isHardcore == true).ToList(); + foreach (var toon in _toons) + if (highestLevel < toon.Level) + highestLevel = toon.Level; + return highestLevel; + } + + public bool InviteToGuild(Guild guild, GameAccount inviter) + { + if (guild.IsClan && Clan != null) + return false; + var invite = D3.Guild.InviteInfo.CreateBuilder() + .SetGuildId(guild.PersistentId) + .SetGuildName(guild.Name) + .SetInviterId(inviter.PersistentID) + .SetCategory(guild.Category) + .SetInviteType(inviter.PersistentID == PersistentID ? 1U : 0U) + .SetExpireTime(3600); + if (guild.IsClan) invite.SetGuildTag(guild.Prefix); + GuildInvites.Add(invite.Build()); + + + var update = D3.Notification.GuildInvitesListUpdate.CreateBuilder(); + update.SetIsRemoved(false).SetGuildId(guild.PersistentId).SetInvite(invite); + + var notification = bgs.protocol.notification.v1.Notification.CreateBuilder(); + notification.SetSenderId(bgs.protocol.EntityId.CreateBuilder().SetHigh(0UL).SetLow(0UL)); + notification.SetTargetAccountId(Owner.BnetEntityId); + notification.SetTargetId(BnetEntityId); + notification.SetType("D3.NotificationMessage"); + notification.AddAttribute(bgs.protocol.Attribute.CreateBuilder() + .SetName("D3.NotificationMessage.MessageId").SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(0))); + notification.AddAttribute(bgs.protocol.Attribute.CreateBuilder() + .SetName("D3.NotificationMessage.Payload") + .SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(update.Build().ToByteString()))); + + LoggedInClient.MakeRPC((lid) => + bgs.protocol.notification.v1.NotificationListener.CreateStub(LoggedInClient).OnNotificationReceived( + new HandlerController() + { + ListenerId = lid + }, notification.Build(), callback => { })); + return true; + } + + public AccountProfile Profile + { + get + { + var dbGAcc = DBGameAccount; + var profile = AccountProfile.CreateBuilder() + .SetParagonLevel((uint)dbGAcc.ParagonLevel) + .SetDeprecatedBestLadderParagonLevel((uint)dbGAcc.ParagonLevel) + .SetParagonLevelHardcore((uint)dbGAcc.ParagonLevelHardcore) + .SetBloodShardsCollected((uint)dbGAcc.TotalBloodShards) + .SetSeasonId(1) + .AddSeasons(1) + //deprecated //.SetHighestDifficulty(Convert.ToUInt32(progress[0], 10)) + .SetNumFallenHeroes(3) + .SetParagonLevelHardcore(0) // Hardcore Paragon Level + .SetBountiesCompleted((uint)dbGAcc.TotalBounties) // Executed orders + .SetLootRunsCompleted(0) // Closed by the Nephalemic Portals + .SetPvpWins(0) + .SetPvpTakedowns(0) + .SetPvpDamage(0) + .SetMonstersKilled(dbGAcc.TotalKilled) // Killed monsters + .SetElitesKilled(dbGAcc.ElitesKilled) // Special Enemies Killed + .SetGoldCollected(dbGAcc.TotalGold) // Collected gold + .SetHighestHardcoreLevel(0) // Maximum level in hermetic mode + .SetHardcoreMonstersKilled(0) // Killed monsters in ger mode + .SetHighestHardcoreLevel(GetHighestHardcoreLevel()) + .SetClassBarbarian(GetClassInfo(ToonClass.Barbarian)) + .SetClassCrusader(GetClassInfo(ToonClass.Crusader)) + .SetClassDemonhunter(GetClassInfo(ToonClass.DemonHunter)) + .SetClassMonk(GetClassInfo(ToonClass.Monk)) + .SetClassWitchdoctor(GetClassInfo(ToonClass.WitchDoctor)) + .SetClassWizard(GetClassInfo(ToonClass.Wizard)) + .SetClassNecromancer(GetClassInfo(ToonClass.Necromancer)); + + + if (dbGAcc.BossProgress[0] != 0xff) profile.SetHighestBossDifficulty1(dbGAcc.BossProgress[0]); + if (dbGAcc.BossProgress[1] != 0xff) profile.SetHighestBossDifficulty2(dbGAcc.BossProgress[1]); + if (dbGAcc.BossProgress[2] != 0xff) profile.SetHighestBossDifficulty3(dbGAcc.BossProgress[2]); + if (dbGAcc.BossProgress[3] != 0xff) profile.SetHighestBossDifficulty4(dbGAcc.BossProgress[3]); + if (dbGAcc.BossProgress[4] != 0xff) profile.SetHighestBossDifficulty5(dbGAcc.BossProgress[4]); + foreach (var hero in Toons) + profile.AddHeroes(HeroMiniProfile.CreateBuilder() + .SetHeroName(hero.Name) + .SetHeroGbidClass((int)hero.ClassID) + .SetHeroFlags((uint)hero.Flags) + .SetHeroId((uint)hero.D3EntityID.IdLow) + .SetHeroLevel(hero.Level) + .SetHeroVisualEquipment(hero.HeroVisualEquipmentField.Value) + ); + profile.SetNumFallenHeroes(1); + + return profile.Build(); + + //*/ + } + } + + public static readonly EntityId AccountHasNoToons = + EntityId.CreateBuilder().SetIdHigh(0).SetIdLow(0).Build(); + + //Platinum + public int Platinum + { + get + { + if (CurrentToon.IsHardcore) return DBGameAccount.HardPlatinum; + + return DBGameAccount.Platinum; + } + set + { + lock (DBGameAccount) + { + if (CurrentToon.IsHardcore) + DBGameAccount.HardPlatinum = value; + else + DBGameAccount.Platinum = value; + DBSessions.SessionUpdate(DBGameAccount); + } + } + } + + public List Toons => ToonManager.GetToonsForGameAccount(this); + + public GameAccount(DBGameAccount dbGameAccount, + List achs = null) + : base(dbGameAccount.Id) + { + //DBGameAccount = dbGameAccount; + AccountId = dbGameAccount.DBAccount.Id; + if (dbGameAccount.LastPlayedHero != null) + _currentToonId = dbGameAccount.LastPlayedHero.Id; + _lastOnline = dbGameAccount.LastOnline; + var banner = BannerConfiguration; //just pre-loading it + + const ulong gameAccountHigh = + (ulong)EntityIdHelper.HighIdType.GameAccountId + 0x0100004433; // + (0x0100004433); + + BnetEntityId = bgs.protocol.EntityId.CreateBuilder().SetHigh(gameAccountHigh).SetLow(PersistentID).Build(); + ProgramField.Value = "D3"; + } + + private void SetField() + { + Achievements = new List(); + AchievementCriteria = new List(); + + var achs = DBSessions + .SessionQueryWhere(dbi => + dbi.DBGameAccount.Id == PersistentID).ToList(); + foreach (var ach in achs) + if (ach.AchievementId == 1) + { + ; + uint countOfTravels = 0; + foreach (var criteria in GameServer.AchievementSystem.AchievementManager.UnserializeBytes(ach.Criteria)) + if (criteria == 3367569) + countOfTravels++; + AchievementCriteria.Add(CriteriaUpdateRecord.CreateBuilder() + .SetCriteriaId32AndFlags8(3367569) + .SetQuantity32(countOfTravels) + .Build() + ); + } + else + { + if (ach.CompleteTime != -1) + Achievements.Add(AchievementUpdateRecord.CreateBuilder() + .SetAchievementId(ach.AchievementId) //74987243307105) + .SetCompletion(ach.CompleteTime) //1476016727) + .Build() + ); + + if (GameServer.AchievementSystem.AchievementManager.UnserializeBytes(ach.Criteria).Count > 0 && + ach.CompleteTime == -1) + foreach (var criteria in GameServer.AchievementSystem.AchievementManager.UnserializeBytes( + ach.Criteria)) + AchievementCriteria.Add(CriteriaUpdateRecord.CreateBuilder() + .SetCriteriaId32AndFlags8(criteria) + .SetQuantity32(1) + .Build() + ); + + if (ach.Quantity > 0 && ach.CompleteTime == -1) + AchievementCriteria.Add(CriteriaUpdateRecord.CreateBuilder() + .SetCriteriaId32AndFlags8( + (uint)GameServer.AchievementSystem.AchievementManager.GetMainCriteria(ach.AchievementId)) + .SetQuantity32((uint)ach.Quantity) + .Build() + ); + } + } + + public bool IsOnline + { + get => LoggedInClient != null; + set { } + } + + private BattleClient _loggedInClient; + + public BattleClient LoggedInClient + { + get => _loggedInClient; + set + { + _loggedInClient = value; + + GameAccountStatusField.Value = IsOnline; + + var current_time = (ulong)DateTime.Now.ToExtendedEpoch(); + + + //checking last online + var dbAcc = Owner.DBAccount; + + ChangedFields.SetPresenceFieldValue(GameAccountStatusField); + ChangedFields.SetPresenceFieldValue(LastOnlineField); + ChangedFields.SetPresenceFieldValue(BannerConfigurationField); + + //TODO: Remove this set once delegate for set is added to presence field + //this.Owner.AccountOnlineField.Value = this.Owner.IsOnline; + //var operation = this.Owner.AccountOnlineField.GetFieldOperation(); + try + { + NotifyUpdate(); + } + catch + { + } + //this.UpdateSubscribers(this.Subscribers, new List() { operation }); + } + } + + /// + /// GameAccount's flags. + /// + public GameAccountFlags Flags + { + get => (GameAccountFlags)DBGameAccount.Flags | GameAccountFlags.HardcoreAdventureModeUnlocked; + set + { + lock (DBGameAccount) + { + var dbGAcc = DBGameAccount; + dbGAcc.Flags = (int)value; + DBSessions.SessionUpdate(dbGAcc); + } + } + } + + public Digest Digest + { + get + { + var builder = Digest.CreateBuilder().SetVersion(116) + // 7447=>99, 7728=> 100, 8801=>102, 8296=>105, 8610=>106, 8815=>106, 8896=>106, 9183=>107 + .SetBannerConfiguration(BannerConfiguration) + //.SetFlags((uint)this.Flags) //1 - Enable Hardcore + .SetFlags((uint)114) + .SetLastPlayedHeroId(LastPlayedHeroId) + .SetRebirthsUsed(0) + .SetStashTabsRewardedFromSeasons(1) + .SetSeasonId(1) + .SetCompletedSoloRift(false) + .SetChallengeRiftAccountData(D3.ChallengeRifts.AccountData.CreateBuilder() + .SetLastChallengeRewardEarned(416175).SetLastChallengeTried(416175) + ) + .AddAltLevels((uint)DBGameAccount.ParagonLevel) + //.AddAltLevels((uint)this.DBGameAccount.ParagonLevelHardcore) + ; + if (Clan != null) + builder.SetGuildId(Clan.PersistentId); + + return builder.Build(); + } + } + + public uint AchievementPoints + { + get { return (uint)Achievements.Where(a => a.Completion != -1).Count() * 10U; } + } + + public bool IsLoggedIn { get; set; } + + #region Notifications + + public override void NotifyUpdate() + { + var operations = ChangedFields.GetChangedFieldList(); + ChangedFields.ClearChanged(); + UpdateSubscribers(Subscribers, operations); + } + + public override List GetSubscriptionNotifications() + { + //for now set it here + GameAccountStatusField.Value = IsOnline; + + var operationList = new List(); + + //gameaccount + //D3,GameAccount,1,0 -> D3.DBAccount.BannerConfiguration + //D3,GameAccount,2,0 -> ToonId + //D3,GameAccount,3,0 -> Activity + //D3,Party,1,0 -> PartyId + //D3,Party,2,0 -> JoinPermission + //D3,Hero,1,0 -> Hero Class + //D3,Hero,2,0 -> Hero's current level + //D3,Hero,3,0 -> D3.Hero.VisualEquipment + //D3,Hero,4,0 -> Hero's flags + //D3,Hero,5,0 -> Hero Name + //D3,Hero,6,0 -> HighestUnlockedAct + //D3,Hero,7,0 -> HighestUnlockedDifficulty + //Bnet,GameAccount,1,0 -> GameAccount Online + //Bnet,GameAccount,3,0 -> FourCC = "D3" + //Bnet,GameAccount,4,0 -> Unk Int (0 if GameAccount is Offline) + //Bnet,GameAccount,5,0 -> BattleTag + //Bnet,GameAccount,6,0 -> DBAccount.Low + "#1" + //Bnet,GameAccount,7,0 -> DBAccount.EntityId + operationList.Add(BannerConfigurationField.GetFieldOperation()); + if (LastPlayedHeroId != AccountHasNoToons) + { + operationList.Add(LastPlayedHeroIdField.GetFieldOperation()); + if (CurrentToon != null) + operationList.AddRange(CurrentToon.GetSubscriptionNotifications()); + } + + operationList.Add(GameAccountStatusField.GetFieldOperation()); + operationList.Add(ProgramField.GetFieldOperation()); + operationList.Add(LastOnlineField.GetFieldOperation()); + operationList.Add(BattleTagField.GetFieldOperation()); + operationList.Add(GameAccountNameField.GetFieldOperation()); + operationList.Add(OwnerIdField.GetFieldOperation()); + if (Clan != null) + operationList.Add(ClanIdField.GetFieldOperation()); + operationList.Add(GameVersionField.GetFieldOperation()); + operationList.Add(PartyIdField.GetFieldOperation()); + operationList.Add(JoinPermissionField.GetFieldOperation()); + operationList.Add(CallToArmsField.GetFieldOperation()); + operationList.Add(ActivityField.GetFieldOperation()); + return operationList; + } + + #endregion + + public void Update(IList operations) + { + var operationsToUpdate = new List(); + foreach (var operation in operations) + switch (operation.Operation) + { + case FieldOperation.Types.OperationType.SET: + var op_build = DoSet(operation.Field); + if (op_build.HasValue) + { + var new_op = operation.ToBuilder(); + new_op.SetField(op_build); + operationsToUpdate.Add(new_op.Build()); + } + + break; + case FieldOperation.Types.OperationType.CLEAR: + DoClear(operation.Field); + break; + default: + Logger.Warn("No operation type."); + break; + } + + if (operationsToUpdate.Count > 0) + UpdateSubscribers(Subscribers, operationsToUpdate); + } + + public void TestUpdate() + { + var operations = GetSubscriptionNotifications(); + /* + operations.Add( + FieldOperation.CreateBuilder() + .SetOperation(FieldOperation.Types.OperationType.SET) + .SetField( + Field.CreateBuilder() + .SetKey(FieldKey.CreateBuilder().SetGroup(4).SetField(3).SetProgram(17459)) + .SetValue(bgs.protocol.Variant.CreateBuilder().SetStringValue("TExt"))) + .Build() + ); + //*/ + //operations.Add(new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Party, 3, 0, "CallToArms").GetFieldOperation()); + //this.Update(operations); + } + + private Field.Builder DoSet(Field field) + { + var operation = FieldOperation.CreateBuilder(); + + var returnField = Field.CreateBuilder().SetKey(field.Key); + if (LoggedInClient == null) return returnField; + + switch ((FieldKeyHelper.Program)field.Key.Program) + { + case FieldKeyHelper.Program.D3: + if (field.Key.Group == 2 && field.Key.Field == 3) //CurrentActivity + { + CurrentActivity = (int)field.Value.IntValue; + returnField.SetValue(field.Value); + Logger.Debug("{0} set CurrentActivity to {1}", this, field.Value.IntValue); + } + else if (field.Key.Group == 2 && field.Key.Field == 4) //Unknown bool + { + returnField.SetValue(field.Value); + Logger.Debug("{0} set CurrentActivity to {1}", this, field.Value.BoolValue); + } + else if (field.Key.Group == 2 && field.Key.Field == 6) //Flags + { + returnField.SetValue(field.Value); + Logger.Debug("{0} set Flags to {1}", this, field.Value.UintValue); + } + else if (field.Key.Group == 2 && field.Key.Field == 8) //? + { + returnField.SetValue(field.Value); + } + else if (field.Key.Group == 2 && field.Key.Field == 11) //Version + { + returnField.SetValue(field.Value); + Logger.Debug("{0} set Version to {1}", this, field.Value.StringValue); + } + else if (field.Key.Group == 4 && field.Key.Field == 1) //PartyId + { + if (field.Value.HasMessageValue) //7727 Sends empty SET instead of a CLEAR -Egris + { + var channel = + ChannelManager.GetChannelByChannelId( + bgs.protocol.channel.v1.ChannelId.ParseFrom(field.Value.MessageValue)); + //this.PartyId = EntityId.CreateBuilder().SetIdLow(NewChannelID.Id).SetIdHigh(0x600000000000000).Build(); + + PartyChannelId = bgs.protocol.channel.v1.ChannelId.ParseFrom(field.Value.MessageValue); + LoggedInClient.CurrentChannel = channel; + var c = bgs.protocol.channel.v1.ChannelId.ParseFrom(field.Value.MessageValue); + //returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); + returnField.SetValue(bgs.protocol.Variant.CreateBuilder() + .SetMessageValue(PartyChannelId.ToByteString()).Build()); + //returnField.SetValue(field.Value); + + + Logger.Debug("{0} set channel to {1}", this, channel); + } + else + { + PartyId = null; + //if(PartyChannelId != null) + // returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); + //else + returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(ByteString.Empty) + .Build()); + Logger.Debug("Empty-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, field.Key.Field); + } + } + else if (field.Key.Group == 4 && field.Key.Field == 2) //JoinPermission + { + if (ScreenStatus.Screen != field.Value.IntValue) + { + ScreenStatus = ScreenStatus.CreateBuilder().SetScreen((int)field.Value.IntValue).SetStatus(0) + .Build(); + Logger.Debug("{0} set current screen to {1}.", this, field.Value.IntValue); + } + + returnField.SetValue(field.Value); + } + else if (field.Key.Group == 4 && field.Key.Field == 3) //CallToArmsMessage + { + Logger.Debug("CallToArmsMessage: {0}, {1}, {2}", field.Key.Group, field.Key.Field, field.Value); + returnField.SetValue(field.Value); + } + else if (field.Key.Group == 4 && field.Key.Field == 4) //Party IsFull + { + returnField.SetValue(field.Value); + } + else if (field.Key.Group == 5 && field.Key.Field == 5) //Game IsPrivate + { + //returnField.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build()); + returnField.SetValue(field.Value); + Logger.Debug("{0} set Game IsPrivate {1}.", this, field.Value.ToString()); + } + else + { + Logger.Warn("GameAccount: Unknown set-field: {0}, {1}, {2} := {3}", field.Key.Program, + field.Key.Group, field.Key.Field, field.Value); + } + + break; + case FieldKeyHelper.Program.BNet: + if (field.Key.Group == 2 && field.Key.Field == 2) // SocialStatus + { + AwayStatus = (AwayStatusFlag)field.Value.IntValue; + returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build()); + Logger.Debug("{0} set AwayStatus to {1}.", this, AwayStatus); + } + else if (field.Key.Group == 2 && field.Key.Field == 8) // RichPresence + { + returnField.SetValue(field.Value); + } + else if (field.Key.Group == 2 && field.Key.Field == 10) // AFK + { + returnField.SetValue(field.Value); + Logger.Debug("{0} set AFK to {1}.", this, field.Value.BoolValue); + } + else + { + Logger.Warn("GameAccount: Unknown set-field: {0}, {1}, {2} := {3}", field.Key.Program, + field.Key.Group, field.Key.Field, field.Value); + } + + break; + } + + //We only update subscribers on fields that actually change values. + return returnField; + } + + private void DoClear(Field field) + { + switch ((FieldKeyHelper.Program)field.Key.Program) + { + case FieldKeyHelper.Program.D3: + Logger.Warn("GameAccount: Unknown clear-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, + field.Key.Field); + break; + case FieldKeyHelper.Program.BNet: + Logger.Warn("GameAccount: Unknown clear-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, + field.Key.Field); + break; + } + } + + public Field QueryField(FieldKey queryKey) + { + var field = Field.CreateBuilder().SetKey(queryKey); + + switch ((FieldKeyHelper.Program)queryKey.Program) + { + case FieldKeyHelper.Program.D3: + if (queryKey.Group == 2 && queryKey.Field == 1) // Banner configuration + { + field.SetValue( + bgs.protocol.Variant.CreateBuilder() + .SetMessageValue(BannerConfigurationField.Value.ToByteString()).Build + ()); + } + else if (queryKey.Group == 2 && queryKey.Field == 2) //Hero's EntityId + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(LastPlayedHeroId.ToByteString()) + .Build()); + } + else if (queryKey.Group == 2 && queryKey.Field == 4) //Unknown Bool + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(true).Build()); + } + else if (queryKey.Group == 2 && queryKey.Field == 8) + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(true).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 1) // Hero's class (GbidClass) + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(CurrentToon.ClassID).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 2) // Hero's current level + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(CurrentToon.Level).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 3) // Hero's visible equipment + { + field.SetValue( + bgs.protocol.Variant.CreateBuilder().SetMessageValue( + CurrentToon.HeroVisualEquipmentField.Value.ToByteString()).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 4) // Hero's flags (gender and such) + { + field.SetValue( + bgs.protocol.Variant.CreateBuilder() + .SetIntValue( /*1073741821*/(uint)(CurrentToon.Flags | ToonFlags.AllUnknowns)).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 5) // Toon name + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetStringValue(CurrentToon.Name).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 6) //highest act + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(400).Build()); + } + else if (queryKey.Group == 3 && queryKey.Field == 7) //highest difficulty + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(9).Build()); + } + else if (queryKey.Group == 4 && queryKey.Field == 1) // Channel ID if the client is online + { + //field.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); + if (PartyId != null) + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyId.ToByteString()) + .Build()); + else field.SetValue(bgs.protocol.Variant.CreateBuilder().Build()); + } + else if (queryKey.Group == 4 && queryKey.Field == 2) + // Current screen (all known values are just "in-menu"; also see ScreenStatuses sent in ChannelService.UpdateChannelState) + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(ScreenStatus.Screen).Build()); + } + else if (queryKey.Group == 4 && queryKey.Field == 4) //Unknown Bool + { + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(false).Build()); + } + else + { + Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group, + queryKey.Field); + } + + break; + case FieldKeyHelper.Program.BNet: + if (queryKey.Group == 2 && queryKey.Field == 1) //GameAccount Logged in + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetBoolValue(GameAccountStatusField.Value) + .Build()); + else if (queryKey.Group == 2 && queryKey.Field == 2) // Away status + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build()); + else if (queryKey.Group == 2 && queryKey.Field == 3) // Program - always D3 + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetFourccValue("D3").Build()); + //field.SetValue(bgs.protocol.Variant.CreateBuilder().SetFourccValue("BNet").Build()); + //BNet = 16974, + //D3 = 17459, + //S2 = 21298, + //WoW = 5730135, + else if (queryKey.Group == 2 && queryKey.Field == 5) // BattleTag + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetStringValue(Owner.BattleTag).Build()); + else if (queryKey.Group == 2 && queryKey.Field == 7) // DBAccount.EntityId + field.SetValue(bgs.protocol.Variant.CreateBuilder().SetEntityIdValue(Owner.BnetEntityId).Build()); + else if (queryKey.Group == 2 && queryKey.Field == 10) // AFK + field.SetValue( + bgs.protocol.Variant.CreateBuilder().SetBoolValue(AwayStatus != AwayStatusFlag.Available) + .Build()); + else + Logger.Warn("GameAccount Unknown query-key: {0}, {1}, {2}", queryKey.Program, queryKey.Group, + queryKey.Field); + break; + } + + return field.HasValue ? field.Build() : null; + } + + public override string ToString() + { + return $"{{ GameAccount: {Owner.BattleTag} [lowId: {BnetEntityId.Low}] }}"; + } + + //TODO: figure out what 1 and 3 represent, or if it is a flag since all observed values are powers of 2 so far /dustinconrad + public enum AwayStatusFlag : uint + { + Available = 0x00, + UnknownStatus1 = 0x01, + Away = 0x02, + UnknownStatus2 = 0x03, + Busy = 0x04 + } + + [Flags] + public enum GameAccountFlags : uint + { + None = 0x00, + HardcoreUnlocked = 0x01, + AdventureModeUnlocked = 0x04, + Paragon100 = 0x08, + MasterUnlocked = 0x10, + TormentUnlocked = 0x20, + AdventureModeTutorial = 0x40, + HardcoreMasterUnlocked = 0x80, + HardcoreTormentUnlocked = 0x100, + HardcoreAdventureModeUnlocked = 0x200 + } +} \ No newline at end of file diff --git a/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs b/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs index c71a02d..556a360 100644 --- a/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs +++ b/src/DiIiS-NA/BGS-Server/AccountsSystem/GameAccountManager.cs @@ -12,7 +12,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem { private static readonly Logger Logger = LogManager.CreateLogger("DataBaseSystem"); - public static readonly ConcurrentDictionary LoadedGameAccounts = new ConcurrentDictionary(); + public static readonly ConcurrentDictionary LoadedGameAccounts = new(); public static int TotalAccounts { @@ -38,7 +38,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem return null; if (LoadedGameAccounts.ContainsKey(dbGameAccount.Id)) { - LoadedGameAccounts[dbGameAccount.Id].DBGameAccount = dbGameAccount; + // LoadedGameAccounts[dbGameAccount.Id].DBGameAccount = dbGameAccount; return LoadedGameAccounts[dbGameAccount.Id]; } else diff --git a/src/DiIiS-NA/BGS-Server/Crypthography/SRP6a.cs b/src/DiIiS-NA/BGS-Server/Crypthography/SRP6a.cs index 6726e94..d4eea21 100644 --- a/src/DiIiS-NA/BGS-Server/Crypthography/SRP6a.cs +++ b/src/DiIiS-NA/BGS-Server/Crypthography/SRP6a.cs @@ -82,7 +82,7 @@ namespace DiIiS_NA.LoginServer.Crypthography // calculate server's public ephemeral value. this.b = GetRandomBytes(128).ToBigInteger(); // server's secret ephemeral value. var gModb = BigInteger.ModPow(g, b, N); // pow(g, b, N) - var k = H.ComputeHash(new byte[0].Concat(N.ToArray()).Concat(g.ToArray()).ToArray()).ToBigInteger(); // Multiplier parameter (k = H(N, g) in SRP-6a + var k = H.ComputeHash(Array.Empty().Concat(N.ToArray()).Concat(g.ToArray()).ToArray()).ToBigInteger(); // Multiplier parameter (k = H(N, g) in SRP-6a this.B = BigInteger.Remainder((BigInteger.Add(BigInteger.Multiply(this.Account.PasswordVerifier.ToBigInteger(), k), gModb)), N); // B = (k * v + pow(g, b, N)) % N // cook the logon challenge message @@ -121,7 +121,7 @@ namespace DiIiS_NA.LoginServer.Crypthography public bool Verify(byte[] A_bytes, byte[] M_client, byte[] seed) { var A = A_bytes.ToBigInteger(); // client's public ephemeral - var u = H.ComputeHash(new byte[0].Concat(A_bytes).Concat(B.ToArray(128)).ToArray()).ToBigInteger(); // Random scrambling parameter - u = H(A, B) + var u = H.ComputeHash(Array.Empty().Concat(A_bytes).Concat(B.ToArray(128)).ToArray()).ToBigInteger(); // Random scrambling parameter - u = H(A, B) var S_s = BigInteger.ModPow(BigInteger.Multiply(A, BigInteger.ModPow(this.Account.PasswordVerifier.ToBigInteger(), u, N)), b, N); // calculate server session key - S = (Av^u) ^ b this.SessionKey = Calc_K(S_s.ToArray(128)); // K = H(S) - Shared, strong session key. @@ -130,7 +130,7 @@ namespace DiIiS_NA.LoginServer.Crypthography var hashgxorhashN = Hash_g_and_N_and_xor_them().ToBigInteger(); // H(N) ^ H(g) var hashedIdentitySalt = H.ComputeHash(Encoding.ASCII.GetBytes(this.IdentitySalt)); // H(I) - var M = H.ComputeHash(new byte[0] // verify client M_client - H(H(N) ^ H(g), H(I), s, A, B, K_c) + var M = H.ComputeHash(Array.Empty() // verify client M_client - H(H(N) ^ H(g), H(I), s, A, B, K_c) .Concat(hashgxorhashN.ToArray(32)) .Concat(hashedIdentitySalt) .Concat(this.Account.Salt.ToArray()) @@ -143,14 +143,14 @@ namespace DiIiS_NA.LoginServer.Crypthography // which allows authentication without the correct password, they should be also calculated for wrong-passsword auths. /raist. // calculate server proof of session key - var M_server = H.ComputeHash(new byte[0] // M_server = H(A, M_client, K) + var M_server = H.ComputeHash(Array.Empty() // M_server = H(A, M_client, K) .Concat(A_bytes) .Concat(M_client) .Concat(K_s) .ToArray()); // cook logon proof message. - LogonProof = new byte[0] + LogonProof = Array.Empty() .Concat(new byte[] { 3 }) // command = 3 - server sends proof of session key to client .Concat(M_server) // server's proof of session key .Concat(B.ToArray(128)) // second proof diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/AuthenticationService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/AuthenticationService.cs index 69a9b75..a987e6a 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/AuthenticationService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/AuthenticationService.cs @@ -88,21 +88,21 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } switch (request.Locale) { - case "deDE": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.deDE; break; - case "enGB": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enGB; break; - case "enSG": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enSG; break; - case "enUS": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.enUS; break; - case "esES": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.esES; break; - case "esMX": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.esMX; break; - case "frFR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.frFR; break; - case "itIT": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.itIT; break; - case "koKR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.koKR; break; - case "plPL": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.plPL; break; - case "ptBR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ptBR; break; - case "ptPT": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ptPT; break; - case "ruRU": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.ruRU; break; - case "trTR": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.trTR; break; - case "zhCN": ((HandlerController)controller).Client.ClientLanguage = Battle.BattleClient.ClientLocale.zhCN; break; + case "deDE": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.deDE; break; + case "enGB": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.enGB; break; + case "enSG": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.enSG; break; + case "enUS": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.enUS; break; + case "esES": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.esES; break; + case "esMX": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.esMX; break; + case "frFR": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.frFR; break; + case "itIT": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.itIT; break; + case "koKR": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.koKR; break; + case "plPL": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.plPL; break; + case "ptBR": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.ptBR; break; + case "ptPT": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.ptPT; break; + case "ruRU": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.ruRU; break; + case "trTR": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.trTR; break; + case "zhCN": ((HandlerController)controller).Client.ClientLanguage = BattleClient.ClientLocale.zhCN; break; } done(NoData.CreateBuilder().Build()); var builder = ChallengeExternalRequest.CreateBuilder(); diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelInvitationService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelInvitationService.cs index 0d86b4a..f6f9463 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelInvitationService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelInvitationService.cs @@ -17,11 +17,11 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public readonly ChannelInvitationManager _invitationManager = new ChannelInvitationManager(); - public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.SubscribeRequest request, Action done) + public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, SubscribeRequest request, Action done) { Logger.Trace("Subscribe() {0}", ((controller as HandlerController).Client)); - this._invitationManager.AddSubscriber(((controller as HandlerController).Client), request.ObjectId); + _invitationManager.AddSubscriber(((controller as HandlerController).Client), request.ObjectId); done(NoData.DefaultInstance); } @@ -32,7 +32,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var response = AcceptInvitationResponse.CreateBuilder().SetObjectId(channel.DynamicId).Build(); done(response); - this._invitationManager.HandleAccept(((controller as HandlerController).Client), request); + _invitationManager.HandleAccept(((controller as HandlerController).Client), request); } public override void DeclineInvitation(Google.ProtocolBuffers.IRpcController controller, DeclineInvitationRequest request, Action done) @@ -40,7 +40,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var respone = NoData.CreateBuilder(); done(respone.Build()); - this._invitationManager.HandleDecline(((controller as HandlerController).Client), request); + _invitationManager.HandleDecline(((controller as HandlerController).Client), request); } public override void RevokeInvitation(Google.ProtocolBuffers.IRpcController controller, RevokeInvitationRequest request, Action done) @@ -48,7 +48,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var builder = NoData.CreateBuilder(); done(builder.Build()); - this._invitationManager.Revoke(((controller as HandlerController).Client), request); + _invitationManager.Revoke(((controller as HandlerController).Client), request); } public override void SendInvitation(Google.ProtocolBuffers.IRpcController controller, SendInvitationRequest request, Action done) @@ -106,11 +106,11 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services (controller as HandlerController).Client.MakeTargetedRPC(channel, (lid) => ChannelListener.CreateStub((controller as HandlerController).Client).OnJoin(new HandlerController() { ListenerId = lid }, builder.Build(), callback => { })); - this._invitationManager.HandleInvitation((controller as HandlerController).Client, invitation.Build()); + _invitationManager.HandleInvitation((controller as HandlerController).Client, invitation.Build()); } - public override void SuggestInvitation(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.SuggestInvitationRequest request, Action done) + public override void SuggestInvitation(Google.ProtocolBuffers.IRpcController controller, SuggestInvitationRequest request, Action done) { var suggester = GameAccountManager.GetAccountByPersistentID(request.TargetId.Low); var suggestee = GameAccountManager.GetAccountByPersistentID(request.ApprovalId.Low); @@ -137,7 +137,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var notification = SuggestionAddedNotification.CreateBuilder().SetSuggestion(suggestion); - suggestee.LoggedInClient.MakeTargetedRPC(this._invitationManager, (lid) => + suggestee.LoggedInClient.MakeTargetedRPC(_invitationManager, (lid) => ChannelInvitationListener.CreateStub(suggestee.LoggedInClient).OnReceivedSuggestionAdded(new HandlerController() { ListenerId = lid }, notification.Build(), callback => { })); } diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelMembershipService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelMembershipService.cs index 42ac287..6a5046f 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelMembershipService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelMembershipService.cs @@ -7,7 +7,7 @@ using System; namespace DiIiS_NA.LoginServer.ServicesSystem.Services { [Service(serviceID: 0x26, serviceHash: 2119327385)] - public class ChannelMembershipService_ : bgs.protocol.channel.v2.membership.ChannelMembershipService, IServerService + public class ChannelMembershipService_ : ChannelMembershipService, IServerService { public override void GetState(IRpcController controller, GetStateRequest request, Action done) { diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelOwnerService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelOwnerService.cs index 4449230..0ef9cb8 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelOwnerService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelOwnerService.cs @@ -14,10 +14,10 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { private static readonly Logger Logger = LogManager.CreateLogger(); - public override void CreateChannel(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.CreateChannelRequest request, System.Action done) + public override void CreateChannel(IRpcController controller, CreateChannelRequest request, Action done) { var channel = ChannelManager.CreateNewChannel(((controller as HandlerController).Client), request.ObjectId); - var builder = bgs.protocol.channel.v1.CreateChannelResponse.CreateBuilder() + var builder = CreateChannelResponse.CreateBuilder() .SetObjectId(channel.DynamicId) .SetChannelId(channel.BnetEntityId) ; @@ -35,16 +35,16 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services foreach (Channel channel in chatChannels) { if (!channel.HasUser(((controller as HandlerController).Client)) && (request.Options.HasName ? request.Options.Name == channel.Name : true) && channel.MaxMembers > channel.Members.Count) - builder.AddChannel(bgs.protocol.channel.v1.ChannelDescription.CreateBuilder().SetCurrentMembers((uint)channel.Members.Count) + builder.AddChannel(ChannelDescription.CreateBuilder().SetCurrentMembers((uint)channel.Members.Count) .SetChannelId(bgs.protocol.EntityId.CreateBuilder().SetHigh(channel.BnetEntityId.High).SetLow(channel.BnetEntityId.Low)) .SetState(channel.State)); } done(builder.Build()); } - public override void GetChannelInfo(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.GetChannelInfoRequest request, System.Action done) + public override void GetChannelInfo(IRpcController controller, GetChannelInfoRequest request, Action done) { - var builder = bgs.protocol.channel.v1.GetChannelInfoResponse.CreateBuilder(); + var builder = GetChannelInfoResponse.CreateBuilder(); var channel = ChannelManager.GetChannelByEntityId(request.ChannelId); if (channel != null) @@ -55,12 +55,12 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services done(builder.Build()); } - public override void JoinChannel(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.JoinChannelRequest request, System.Action done) + public override void JoinChannel(IRpcController controller, JoinChannelRequest request, Action done) { var channel = ChannelManager.GetChannelByEntityId(request.ChannelId); channel.Join(((controller as HandlerController).Client), request.ObjectId); - var builder = bgs.protocol.channel.v1.JoinChannelResponse.CreateBuilder().SetObjectId(channel.DynamicId).SetMemberId((controller as HandlerController).Client.Account.BnetEntityId); + var builder = JoinChannelResponse.CreateBuilder().SetObjectId(channel.DynamicId).SetMemberId((controller as HandlerController).Client.Account.BnetEntityId); ((controller as HandlerController).Client).ChatChannels.Add(channel); @@ -69,10 +69,10 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services - public override void SubscribeChannel(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.SubscribeChannelRequest request, Action done) + public override void SubscribeChannel(IRpcController controller, SubscribeChannelRequest request, Action done) { var channel = ChannelManager.GetChannelByEntityId(request.ChannelId); - var builder = bgs.protocol.channel.v1.SubscribeChannelResponse.CreateBuilder(); + var builder = SubscribeChannelResponse.CreateBuilder(); builder.SetObjectId(channel.DynamicId); done(builder.Build()); diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelService.cs index 014199a..78f199f 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ChannelService.cs @@ -21,12 +21,12 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services private static readonly Logger Logger = LogManager.CreateLogger(); - public override void Dissolve(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.DissolveRequest request, System.Action done) + public override void Dissolve(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.DissolveRequest request, Action done) { throw new NotImplementedException(); } - public override void RemoveMember(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.RemoveMemberRequest request, System.Action done) + public override void RemoveMember(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.RemoveMemberRequest request, Action done) { Logger.Trace("RemoveMember()"); var channel = ChannelManager.GetChannelByDynamicId(((controller as HandlerController).LastCallHeader).ObjectId); @@ -39,13 +39,13 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services if (request.Reason == 0) { ulong invId = ChannelInvitationManager.FindInvAsForClient((controller as HandlerController).Client); - if (invId != System.UInt64.MaxValue) + if (invId != UInt64.MaxValue) ChannelInvitationManager.AltConnectToJoin((controller as HandlerController).Client, bgs.protocol.channel.v1.AcceptInvitationRequest.CreateBuilder().SetInvitationId(invId).SetObjectId(0).Build()); //ServicesSystem.Services.ChannelInvitationService.CreateStub((controller as HandlerController).Client).AcceptInvitation(controller, bgs.protocol.channel.v1.AcceptInvitationRequest.CreateBuilder().SetInvitationId(invId).SetObjectId(0).Build(), callback => { }); } } - public override void SendMessage(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.SendMessageRequest request, System.Action done) + public override void SendMessage(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.SendMessageRequest request, Action done) { var channel = ChannelManager.GetChannelByDynamicId(((controller as HandlerController).LastCallHeader).ObjectId); //Logger.Trace("{0} sent a message to channel {1}.", ((controller as HandlerController).Client).Account.GameAccount.CurrentToon, channel); @@ -65,7 +65,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services channel.SendMessage(((controller as HandlerController).Client), request.Message); // if it's not parsed as an command - let channel itself to broadcast message to it's members. } - public override void UpdateChannelState(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.UpdateChannelStateRequest request, System.Action done) + public override void UpdateChannelState(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.UpdateChannelStateRequest request, Action done) { /* if (this._loggedInClient.CurrentChannel != channel) @@ -349,7 +349,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } } - public override void UpdateMemberState(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.UpdateMemberStateRequest request, System.Action done) + public override void UpdateMemberState(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.UpdateMemberStateRequest request, Action done) { var channel = ChannelManager.GetChannelByDynamicId(((controller as HandlerController).LastCallHeader).ObjectId); var builder = bgs.protocol.NoData.CreateBuilder(); diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ConnectionSerivce.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ConnectionSerivce.cs index 6a6687d..24d2cbf 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ConnectionSerivce.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ConnectionSerivce.cs @@ -75,9 +75,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public override void RequestDisconnect(IRpcController controller, DisconnectRequest request, Action done) { Logger.Info("Client - {0} , disconnected", (controller as HandlerController).Client.SocketConnection.RemoteAddress); - this.DisconnectClient(controller as HandlerController); + DisconnectClient(controller as HandlerController); if ((controller as HandlerController).Client.Account != null) - (controller as HandlerController).Client.Account.GameAccount.Logined = false; + (controller as HandlerController).Client.Account.GameAccount.IsLoggedIn = false; ((controller as HandlerController).Client).Connect.CloseAsync(); (controller as HandlerController).Client.SocketConnection.CloseAsync(); /* @@ -98,7 +98,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services private void DisconnectClient(HandlerController controller) { if (controller.Client.Account != null && controller.Client.Account.GameAccount != null) controller.Client.Account.GameAccount.LoggedInClient = null; - LoginServer.Battle.PlayerManager.PlayerDisconnected(controller.Client); + Battle.PlayerManager.PlayerDisconnected(controller.Client); } } } diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/FriendService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/FriendService.cs index 79a2245..3422887 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/FriendService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/FriendService.cs @@ -143,33 +143,33 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services (controller as HandlerController).Client.Account.NotifyUpdate(); (controller as HandlerController).Client.Account.GameAccount.NotifyUpdate(); } - public override void AcceptInvitation(IRpcController controller, AcceptInvitationRequest request, Action done) + public override void AcceptInvitation(IRpcController controller, AcceptInvitationRequest request, Action done) { Logger.Trace("{0} accepted friend invitation.", ((controller as HandlerController).Client).Account); - var response = bgs.protocol.NoData.CreateBuilder(); + var response = NoData.CreateBuilder(); done(response.Build()); FriendManager.HandleAccept(((controller as HandlerController).Client), request); } - public override void RevokeInvitation(IRpcController controller, RevokeInvitationRequest request, Action done) + public override void RevokeInvitation(IRpcController controller, RevokeInvitationRequest request, Action done) { throw new NotImplementedException(); } - public override void DeclineInvitation(IRpcController controller, DeclineInvitationRequest request, Action done) + public override void DeclineInvitation(IRpcController controller, DeclineInvitationRequest request, Action done) { Logger.Trace("{0} declined friend invitation.", ((controller as HandlerController).Client).Account); - var response = bgs.protocol.NoData.CreateBuilder(); + var response = NoData.CreateBuilder(); done(response.Build()); FriendManager.HandleDecline(((controller as HandlerController).Client), request); } - public override void IgnoreInvitation(IRpcController controller, IgnoreInvitationRequest request, Action done) + public override void IgnoreInvitation(IRpcController controller, IgnoreInvitationRequest request, Action done) { //throw new NotImplementedException(); - var response = bgs.protocol.NoData.CreateBuilder(); + var response = NoData.CreateBuilder(); done(response.Build()); FriendManager.HandleIgnore(((controller as HandlerController).Client), request); diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameRequestService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameRequestService.cs index c33690d..3e2b88e 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameRequestService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameRequestService.cs @@ -114,7 +114,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var channelStatePermission = bgs.protocol.channel.v1.ChannelState.CreateBuilder() .AddAttribute(bgs.protocol.Attribute.CreateBuilder() .SetName("D3.Party.JoinPermissionPreviousToLock") - .SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(1).Build()) + .SetValue(Variant.CreateBuilder().SetIntValue(1).Build()) .Build()).Build(); var notificationPermission = bgs.protocol.channel.v1.UpdateChannelStateNotification.CreateBuilder() @@ -134,7 +134,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .SetType("GQ_ENTRY"); var attrF = bgs.protocol.Attribute.CreateBuilder() .SetName("game_request_id") - .SetValue(bgs.protocol.Variant.CreateBuilder().SetUintValue(gameFound.RequestId).Build()); + .SetValue(Variant.CreateBuilder().SetUintValue(gameFound.RequestId).Build()); notificationFound.AddAttribute(attrF); (((HandlerController) controller).Client).MakeRPC((lid) => diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameUtilitiesService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameUtilitiesService.cs index 1638ad5..5145f62 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameUtilitiesService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/GameUtilitiesService.cs @@ -1,4 +1,5 @@ //Blizzless Project 2022 + using bgs.protocol; using bgs.protocol.game_utilities.v1; using bgs.protocol.notification.v1; @@ -26,6 +27,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public class InitialLoginTask { private BattleClient Client; + public InitialLoginTask(BattleClient inClient) { Client = inClient; @@ -34,55 +36,70 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public void run() { InitialLoginData.Builder Init = InitialLoginData.CreateBuilder(); - Init.SetOutstandingOrder(D3.Store.Order.CreateBuilder().SetAcknowledged(true).SetErrorCode(0).SetStatus(0).SetTransactionId(0)); + Init.SetOutstandingOrder(D3.Store.Order.CreateBuilder().SetAcknowledged(true).SetErrorCode(0).SetStatus(0) + .SetTransactionId(0)); var GAS = D3.Client.GameAccountSettings.CreateBuilder() - .SetShowDifficultySelector(false) - .SetUseGameHandicapDeprecated(true) - .SetSeasonJourneySeasonNumber(10) - .SetViewedAnniversaryScreenYear(1) - .SetAccountFlags(0) - .SetAccountFlags((uint)D3.Account.Digest.Types.Flags.MASTER_DIFFICULTY_UNLOCKED) - .SetAchievementsTimeLastViewed(DateTimeExtensions.ToUnixTime(DateTime.UtcNow)) - //.SetViewedAnniversaryScreenYear(1) - .SetViewedWhatsNewVersion(20) - .SetViewedWhatsNewSeason(20) - .SetRmtLastUsedCurrency("PLATINUM") - .SetRmtPreferredCurrency("PLATINUM") - + .SetShowDifficultySelector(false) + .SetUseGameHandicapDeprecated(true) + .SetSeasonJourneySeasonNumber(10) + .SetViewedAnniversaryScreenYear(1) + .SetAccountFlags(0) + .SetAccountFlags((uint)D3.Account.Digest.Types.Flags.MASTER_DIFFICULTY_UNLOCKED) + .SetAchievementsTimeLastViewed(DateTimeExtensions.ToUnixTime(DateTime.UtcNow)) + //.SetViewedAnniversaryScreenYear(1) + .SetViewedWhatsNewVersion(20) + .SetViewedWhatsNewSeason(20) + .SetRmtLastUsedCurrency("PLATINUM") + .SetRmtPreferredCurrency("PLATINUM") ; //Client.Account.GameAccount.DBGameAccount.ViewedNewVersion = 8; Init.SetChatRestrictionContentLicenseId(0); - Init.SetAchievementsContentHandle(D3.OnlineService.ContentHandle.CreateBuilder().SetHash("20375546335DA13E31554A104FE036B5BCC878D715108F1FCEB50AB85BD87478").SetRegion("EU").SetUsage(".achu")); + Init.SetAchievementsContentHandle(D3.OnlineService.ContentHandle.CreateBuilder() + .SetHash("20375546335DA13E31554A104FE036B5BCC878D715108F1FCEB50AB85BD87478").SetRegion("EU") + .SetUsage(".achu")); HeroDigestListResponse.Builder d = HeroDigestListResponse.CreateBuilder(); foreach (Toon t in Client.Account.GameAccount.Toons) { d.AddDigestList(t.Digest); GAS.AddHeroListOrder(t.D3EntityID); } + Init.SetGameAccountSettings(GAS); Init.SetHeroDigests(d); Init.SetAccountDigest(Client.Account.GameAccount.Digest); + + const int seasonNumber = 1; + const int seasonState = 1; + const int leaderboardEra = 1; + const int anniversaryEventStatus = 1; + const int challangeRiftNumber = 1; + const bool freeToPlay = true; + const bool storeStatus = true; // false + const string catalogDigest = "C42DC6117A7008EDA2006542D6C07EAD096DAD90"; + const string catalogVersion = "633565800390338000"; + const int regionId = 1; + Init.SetSyncedVars( - " OnlineService.Season.Num=1" + //Season number - " OnlineService.Season.State=1" + //Season status, 1 - Activated, 0 - Deactivated - " OnlineService.Leaderboard.Era=1" + - " OnlineService.AnniversaryEvent.Status=1" + //Anniversary Event, 1st Old Tristam - " ChallengeRift.ChallengeNumber=1" + //Rift portal number. - " OnlineService.FreeToPlay=true" + //Shop for Platinum - " OnlineService.Store.Status=0" + //Store Status, 0 - Enabled, 1 - Disabled - " OnlineService.Store.ProductCatalogDigest=C42DC6117A7008EDA2006542D6C07EAD096DAD90" + //China - " OnlineService.Store.ProductCatalogVersion=633565800390338000" + //Chinese Catalog - //" OnlineService.Store.ProductCatalogDigest=79162283AFACCBA5DA989BD341F7B782860AC1F4" + //Euro - //" OnlineService.Store.ProductCatalogVersion=635984100169931000" + //Euro - " OnlineService.Region.Id=1"); //Region + $" OnlineService.Season.Num={seasonNumber}" + //Season number + $" OnlineService.Season.State={seasonState}" + //Season status, 1 - Activated, 0 - Deactivated + $" OnlineService.Leaderboard.Era={leaderboardEra}" + + $" OnlineService.AnniversaryEvent.Status={anniversaryEventStatus}" + //Anniversary Event, 1st Old Tristam + $" ChallengeRift.ChallengeNumber={challangeRiftNumber}" + //Rift portal number. + $" OnlineService.FreeToPlay={freeToPlay}" + //Shop for Platinum + $" OnlineService.Store.Status={(storeStatus ? "1" : "0")}" + //Store Status, 0 - Enabled, 1 - Disabled + $" OnlineService.Store.ProductCatalogDigest={catalogDigest}" + //China + $" OnlineService.Store.ProductCatalogVersion={catalogVersion}" + //Chinese Catalog + //" OnlineService.Store.ProductCatalogDigest=79162283AFACCBA5DA989BD341F7B782860AC1F4" + //Euro + //" OnlineService.Store.ProductCatalogVersion=635984100169931000" + //Euro + $" OnlineService.Region.Id={regionId}"); //Region Init.SetSeenTutorials(ByteString.CopyFrom(Client.Account.GameAccount.DBGameAccount.SeenTutorials)); Init.SetMatchmakingPool("Default"); - + var guildInfo = D3.Guild.GuildInfoList.CreateBuilder(); if (Client.Account.GameAccount.Clan != null || Client.Account.GameAccount.Communities.Count > 0) { @@ -102,6 +119,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .SetTotalMembers((uint)clan.Members.Count); guildInfo.AddGuilds(clanInfo); } + foreach (var community in Client.Account.GameAccount.Communities) { var communityInfo = D3.Guild.GuildInfo.CreateBuilder() @@ -118,27 +136,32 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } //*/ } + Init.SetGuilds(guildInfo); - - Init.SetGuildInvites(D3.Guild.InviteInfoList.CreateBuilder().AddRangeInvites(Client.Account.GameAccount.GuildInvites)); + + Init.SetGuildInvites(D3.Guild.InviteInfoList.CreateBuilder() + .AddRangeInvites(Client.Account.GameAccount.GuildInvites)); Init.AddEras(EraInfo.CreateBuilder().SetId(0).SetNameDeprecated("TestEra")); - Init.SetLogonTime(DateTimeExtensions.ToUnixTime(DateTime.UtcNow)); - Init.SetMissingEntitlements(D3.Store.MissingEntitlements.CreateBuilder().AddEntitlement(D3.Store.MissingEntitlement.CreateBuilder())); + Init.SetLogonTime(DateTime.UtcNow.ToUnixTime()); + Init.SetMissingEntitlements(D3.Store.MissingEntitlements.CreateBuilder() + .AddEntitlement(D3.Store.MissingEntitlement.CreateBuilder())); ContentLicenses.Builder licences = ContentLicenses.CreateBuilder(); - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(0).SetQuantity(1)); // Diablo III - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(1).SetQuantity(1)); // Diablo III Reaper Of Souls - MENU - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(2).SetQuantity(1)); // Crusader - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(3).SetQuantity(1)); // ? - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(4).SetQuantity(1)); // Diablo III Reaper Of Souls - ACT V - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(5).SetQuantity(1)); // ? - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(6).SetQuantity(1)); // ? + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(0).SetQuantity(1)); // Diablo III + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(1) + .SetQuantity(1)); // Diablo III Reaper Of Souls - MENU + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(2).SetQuantity(1)); // Crusader + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(3).SetQuantity(1)); // ? + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(4) + .SetQuantity(1)); // Diablo III Reaper Of Souls - ACT V + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(5).SetQuantity(1)); // ? + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(6).SetQuantity(1)); // ? //licences.AddLicenses(ContentLicense.CreateBuilder().SetId(7).SetQuantity(1)); // + 6 Heroes Slots //licences.AddLicenses(ContentLicense.CreateBuilder().SetId(8).SetQuantity(1)); // + 2 Heroes Slots //licences.AddLicenses(ContentLicense.CreateBuilder().SetId(9).SetQuantity(1)); // + 3 Heroes Slots - licences.AddLicenses(ContentLicense.CreateBuilder().SetId(10).SetQuantity(1)); // + 8 Heroes Slots + licences.AddLicenses(ContentLicense.CreateBuilder().SetId(10).SetQuantity(1)); // + 8 Heroes Slots //licences.AddLicenses(ContentLicense.CreateBuilder().SetId(11).SetQuantity(1)); // + 1 Heroes Slots licences.AddLicenses(ContentLicense.CreateBuilder().SetId(15).SetQuantity(1)); // Elite Edition licences.AddLicenses(ContentLicense.CreateBuilder().SetId(20).SetQuantity(1)); // Necromancer @@ -153,26 +176,30 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services // Build response InitialLoginDataResponse.Builder res = InitialLoginDataResponse.CreateBuilder(); res.SetErrorCode(0U) - .SetServiceId(Client.GuildChannelsRevealed ? 0U : 1U) - .SetLoginData(Init); + .SetServiceId(Client.GuildChannelsRevealed ? 0U : 1U) + .SetLoginData(Init); // Build notification - bgs.protocol.notification.v1.Notification.Builder builder = bgs.protocol.notification.v1.Notification.CreateBuilder(); + bgs.protocol.notification.v1.Notification.Builder builder = + bgs.protocol.notification.v1.Notification.CreateBuilder(); builder.SetSenderId(bgs.protocol.EntityId.CreateBuilder().SetHigh(0).SetLow(0)); builder.SetTargetAccountId(Client.Account.BnetEntityId); builder.SetTargetId(Client.Account.GameAccount.BnetEntityId); - + builder.SetType("D3.NotificationMessage"); bgs.protocol.Attribute.Builder messageId = bgs.protocol.Attribute.CreateBuilder(); messageId.SetName("D3.NotificationMessage.MessageId") - .SetValue(Variant.CreateBuilder().SetIntValue(1)); // InitialLoginDataResponse + .SetValue(Variant.CreateBuilder().SetIntValue(1)); // InitialLoginDataResponse bgs.protocol.Attribute.Builder payload = bgs.protocol.Attribute.CreateBuilder(); payload.SetName("D3.NotificationMessage.Payload") .SetValue(Variant.CreateBuilder().SetMessageValue(res.Build().ToByteString())); builder.AddAttribute(messageId); builder.AddAttribute(payload); - Client.MakeRPC((lid) => NotificationListener.CreateStub(Client).OnNotificationReceived(new HandlerController() { ListenerId = lid }, builder.Build(), callback => { })); + Client.MakeRPC((lid) => + NotificationListener.CreateStub(Client) + .OnNotificationReceived(new HandlerController() { ListenerId = lid }, builder.Build(), + callback => { })); if (!Client.GuildChannelsRevealed) { @@ -180,18 +207,17 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services GuildManager.ReplicateGuilds(Client.Account.GameAccount); } } - - } - - [Service(serviceID: 0x38, serviceName: "bnet.protocol.game_utilities.GameUtilities"), ] + + [Service(serviceID: 0x38, serviceName: "bnet.protocol.game_utilities.GameUtilities"),] public class GameUtilitiesService : bgs.protocol.game_utilities.v1.GameUtilitiesService, IServerService { private static readonly Logger Logger = LogManager.CreateLogger(); public static ulong counter { get; set; } - public override void ProcessClientRequest(IRpcController controller, ClientRequest request, Action done) + public override void ProcessClientRequest(IRpcController controller, ClientRequest request, + Action done) { ClientResponse.Builder builder = ClientResponse.CreateBuilder(); var attr = bgs.protocol.Attribute.CreateBuilder(); @@ -200,73 +226,88 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services #if DEBUG if (messageId != 270) - Logger.Debug("ProcessClientRequest() ID: {0}", messageId); + Logger.Debug($"$[olive]$ProcessClientRequest({messageId})$[/]$"); #endif switch (((HandlerController)controller).Client.Account.GameAccount.ProgramField.Value) { case "D3": switch (messageId) { - case 0: // HeroDigestListRequest - ByteString digest = OnHeroDigestListRequest(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 0: // HeroDigestListRequest + ByteString digest = OnHeroDigestListRequest(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(digest)); break; - case 1: // CreateHero - ByteString hero = OnHeroCreateParams(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 1: // CreateHero + ByteString hero = OnHeroCreateParams(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); if (hero != null) attr.SetValue(Variant.CreateBuilder().SetMessageValue(hero)); else ((HandlerController)controller).Status = 17; break; - case 2: // DeleteHero - ByteString hero1 = OnHeroDeleteParams(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 2: // DeleteHero + ByteString hero1 = OnHeroDeleteParams(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(hero1)); break; - case 3: // Hero Select - ByteString switchHero = SwitchCharRequest(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 3: // Hero Select + ByteString switchHero = SwitchCharRequest(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(switchHero)); break; case 4: //D3.GameMessages.SaveBannerConfiguration -> return MessageId with no Message - SaveBanner(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + SaveBanner(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); var attrId = bgs.protocol.Attribute.CreateBuilder() .SetName("CustomMessageId") - .SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue(5).Build()) + .SetValue(Variant.CreateBuilder().SetIntValue(5).Build()) .Build(); builder.AddAttribute(attrId); break; - case 6: // InitialLoginDataRequest -> InitialLoginDataQueuedResponse - ByteString loginData = OnInitialLoginDataRequest(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 6: // InitialLoginDataRequest -> InitialLoginDataQueuedResponse + ByteString loginData = OnInitialLoginDataRequest(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(loginData)); break; case 7: var getAccountSettings = GetGameAccountSettings(((HandlerController)controller).Client); - attr.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(getAccountSettings).Build()); + attr.SetValue(Variant.CreateBuilder().SetMessageValue(getAccountSettings) + .Build()); break; - case 8: - var setAccountSettings = SetGameAccountSettings(D3.GameMessage.SetGameAccountSettings.ParseFrom(request.GetAttribute(2).Value.MessageValue), ((HandlerController)controller).Client); - attr.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(setAccountSettings).Build()); + case 8: + var setAccountSettings = SetGameAccountSettings( + D3.GameMessage.SetGameAccountSettings.ParseFrom(request.GetAttribute(2).Value + .MessageValue), ((HandlerController)controller).Client); + attr.SetValue(Variant.CreateBuilder().SetMessageValue(setAccountSettings) + .Build()); break; - case 9: // GetToonSettings -> ToonSettings - ByteString toonSettings = OnGetToonSettings(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 9: // GetToonSettings -> ToonSettings + ByteString toonSettings = OnGetToonSettings(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(toonSettings)); break; case 10: // SetToonSettings -> Empty Message??? - ByteString Current = GetAchievements(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString Current = GetAchievements(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(Current)); // attr.SetValue(Variant.CreateBuilder().SetMessageValue(ByteString.Empty)); break; case 14: //D3.GameMessage.GetAccountProfiles - var getprofile1 = CollectProfiles(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + var getprofile1 = CollectProfiles(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(getprofile1)); //CollectHeroesProfiles break; case 15: //D3.GameMessage.GetHeroProfiles -> D3.Profile.HeroProfileList //var gettoon = SelectToon(Client.Connect, request.GetAttribute(2).Value.MessageValue); - var heroprofs = GetHeroProfs(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + var heroprofs = GetHeroProfs(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(heroprofs)); break; - case 16: // GetAccountPrefs -> (D3.Client.)Preferences - ByteString prefs = OnGetAccountPrefs(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + case 16: // GetAccountPrefs -> (D3.Client.)Preferences + ByteString prefs = OnGetAccountPrefs(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(prefs)); break; case 18: // @@ -274,15 +315,18 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services //attr.SetValue(Variant.CreateBuilder().SetMessageValue(TestNB)); break; case 19: // Getting all cosmetics - ByteString CurrentToon = GetCollectionAccout(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString CurrentToon = GetCollectionAccout(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(CurrentToon)); break; case 23: //Information about dead characters - var herodeadprofs = GetDeadedHeroProfs(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + var herodeadprofs = GetDeadedHeroProfs(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(herodeadprofs)); var attr2 = bgs.protocol.Attribute.CreateBuilder(); - var heroAddedDigests = GetDeadedHeroDigests(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + var heroAddedDigests = GetDeadedHeroDigests(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr2.SetValue(Variant.CreateBuilder().SetMessageValue(heroAddedDigests)); attr2.SetName("CustomMessage2"); builder.AddAttribute(attr2); @@ -292,143 +336,181 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services //attr.SetValue(Variant.CreateBuilder().SetMessageValue(ClearActsResponse)); break; case 29: //Set Cosmetic - ByteString Current1 = SetCollection(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString Current1 = SetCollection(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(Current1)); break; case 32: //ChallengeRift Fetch HeroData - ByteString ChallengeRift = GetChallengeRift(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString ChallengeRift = GetChallengeRift(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(ChallengeRift)); break; case 33: //Rebirth - ByteString RebirthResponse = RebirthMethod(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString RebirthResponse = RebirthMethod(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(RebirthResponse)); break; case 120: //Creation of a guild - ByteString CreatedGuild = CreateGuild(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString CreatedGuild = CreateGuild(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(CreatedGuild)); break; case 121: //TODO: Clan invitation - ByteString GSuggest = GuildInvit(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString GSuggest = GuildInvit(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(GSuggest).Build()); break; case 122: //Joining a Guild - ByteString InvitedToGuild = AcceptInviteToGuild(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString InvitedToGuild = AcceptInviteToGuild(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(InvitedToGuild)); break; case 124: //TODO: Clan message of the day - GuildSetMOTD(((HandlerController)controller).Client, D3.GameMessage.GuildSetMotd.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildSetMOTD(((HandlerController)controller).Client, + GuildSetMotd.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 125: //TODO: Add clan news - GuildSetNews(((HandlerController)controller).Client, D3.GameMessage.GuildSetNews.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildSetNews(((HandlerController)controller).Client, + D3.GameMessage.GuildSetNews.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 127: //Rank changes break; case 129: //Rank promotion - var promote = GuildPromoteMember(((HandlerController)controller).Client, D3.GameMessage.GuildPromoteMember.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + var promote = GuildPromoteMember(((HandlerController)controller).Client, + D3.GameMessage.GuildPromoteMember.ParseFrom(request.GetAttribute(2).Value + .MessageValue)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(promote).Build()); break; case 130: //Rank demotion - var demote = GuildDemoteMember(((HandlerController)controller).Client, D3.GameMessage.GuildDemoteMember.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + var demote = GuildDemoteMember(((HandlerController)controller).Client, + D3.GameMessage.GuildDemoteMember.ParseFrom(request.GetAttribute(2).Value.MessageValue)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(demote).Build()); break; case 132: //Guild kick - ByteString ExitFrGuild = ExitFromGuild(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString ExitFrGuild = ExitFromGuild(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(ExitFrGuild)); break; case 133: //Kick from the clan - GuildKickMemberP(((HandlerController)controller).Client, D3.GameMessage.GuildKickMember.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildKickMemberP(((HandlerController)controller).Client, + GuildKickMember.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 134: //Disbanding a clan - GuildDisband(((HandlerController)controller).Client, D3.GameMessage.GuildId.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildDisband(((HandlerController)controller).Client, + GuildId.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 138: //Guild creation - ByteString createCommunity = CreateCommunity(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString createCommunity = CreateCommunity(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(createCommunity)); break; case 144: //TODO: Guild information - GuildSetDescription(((HandlerController)controller).Client, D3.GameMessage.GuildSetDescription.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildSetDescription(((HandlerController)controller).Client, + D3.GameMessage.GuildSetDescription.ParseFrom(request.GetAttribute(2).Value + .MessageValue)); break; case 146: //TODO: - var inviteList = GetInviteList(((HandlerController)controller).Client, D3.GameMessage.GuildId.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + var inviteList = GetInviteList(((HandlerController)controller).Client, + GuildId.ParseFrom(request.GetAttribute(2).Value.MessageValue)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(inviteList).Build()); break; case 148: //Request to join the guild - ByteString guildSuggest = GuildSuggest(((HandlerController)controller).Client, D3.GameMessage.GuildSuggest.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + ByteString guildSuggest = GuildSuggest(((HandlerController)controller).Client, + D3.GameMessage.GuildSuggest.ParseFrom(request.GetAttribute(2).Value.MessageValue)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(guildSuggest)); //ByteString Invite = InviteToGuild(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); //attr.SetValue(Variant.CreateBuilder().SetMessageValue(Invite)); break; case 149: - GuildSuggestionResponse(((HandlerController)controller).Client, D3.GameMessage.GuildSuggestionResponse.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildSuggestionResponse(((HandlerController)controller).Client, + D3.GameMessage.GuildSuggestionResponse.ParseFrom(request.GetAttribute(2).Value + .MessageValue)); break; - case 150:// Clan news - ByteString news = GuildFetchNews(((HandlerController)controller).Client, D3.GameMessage.GuildFetchNews.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + case 150: // Clan news + ByteString news = GuildFetchNews(((HandlerController)controller).Client, + D3.GameMessage.GuildFetchNews.ParseFrom(request.GetAttribute(2).Value.MessageValue)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(news).Build()); //GetInviteList(((HandlerController)controller).Client, D3.GameMessage.GuildId.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 152: //Cancel request to join the guild - GuildCancelInvite(((HandlerController)controller).Client, D3.GameMessage.GuildCancelInvite.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildCancelInvite(((HandlerController)controller).Client, + D3.GameMessage.GuildCancelInvite.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 156: //Guild settings change - GuildLFM(((HandlerController)controller).Client, D3.GameMessage.GuildSetLFM.ParseFrom(request.GetAttribute(2).Value.MessageValue)); + GuildLFM(((HandlerController)controller).Client, + GuildSetLFM.ParseFrom(request.GetAttribute(2).Value.MessageValue)); break; case 190: //Search Guild - ByteString guildSearch = SearchGuilds(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString guildSearch = SearchGuilds(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(guildSearch)); break; case 200: //Rating - ByteString rating = GetRating(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString rating = GetRating(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(rating)); break; case 201: //Rating1 - ByteString ratingAlt = GetRatingAlt(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString ratingAlt = GetRatingAlt(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(ratingAlt)); break; case 202: //personal rating - ByteString personalRating = GetRatingPersonal(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString personalRating = GetRatingPersonal(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(personalRating)); break; case 210: - ByteString storeResponse = CurrentStore(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString storeResponse = CurrentStore(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(storeResponse)); break; case 211: - ByteString storeResponse1 = CurrentStore1(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString storeResponse1 = CurrentStore1(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(storeResponse1)); break; case 212: //Purchase - ByteString currentWalletResponse = CurrentWallet(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString currentWalletResponse = CurrentWallet(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(currentWalletResponse)); break; case 213: //Real currency - ByteString currentPrimaryWalletResponse = CurrentPrimaryWallet(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString currentPrimaryWalletResponse = CurrentPrimaryWallet( + ((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(currentPrimaryWalletResponse)); break; case 216: //Collection - ByteString test = TestRequest(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString test = TestRequest(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(test)); break; case 230: //GetAchievementSnapshot - var GetAchievementsSnapshot = CollectAchivementsSnapshot(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + var GetAchievementsSnapshot = CollectAchivementsSnapshot( + ((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(GetAchievementsSnapshot)); break; case 250: //Purchase - ByteString SwitchParams = SwitchParameters(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString SwitchParams = SwitchParameters(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(SwitchParams)); break; case 270: //Purchase - ByteString TestResponse = SendWarden3Custom(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); + ByteString TestResponse = SendWarden3Custom(((HandlerController)controller).Client, + request.GetAttribute(2).Value.MessageValue); attr.SetValue(Variant.CreateBuilder().SetMessageValue(TestResponse)); break; } + if (attr.HasValue) { attr.SetName("CustomMessage"); builder.AddAttribute(attr); } + break; } - + done(builder.Build()); if (messageId == 6) @@ -436,46 +518,62 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var LogTask = new InitialLoginTask(((HandlerController)controller).Client); LogTask.run(); } - } #region Service Methods - public override void GetAchievementsFile(IRpcController controller, GetAchievementsFileRequest request, Action done) + + public override void GetAchievementsFile(IRpcController controller, GetAchievementsFileRequest request, + Action done) { throw new NotImplementedException(); } - public override void GetAllValuesForAttribute(IRpcController controller, GetAllValuesForAttributeRequest request, Action done) + + public override void GetAllValuesForAttribute(IRpcController controller, + GetAllValuesForAttributeRequest request, Action done) { throw new NotImplementedException(); } - public override void GetPlayerVariables(IRpcController controller, GetPlayerVariablesRequest request, Action done) + + public override void GetPlayerVariables(IRpcController controller, GetPlayerVariablesRequest request, + Action done) { throw new NotImplementedException(); } - public override void OnGameAccountOffline(IRpcController controller, GameAccountOfflineNotification request, Action done) + + public override void OnGameAccountOffline(IRpcController controller, GameAccountOfflineNotification request, + Action done) { throw new NotImplementedException(); } - public override void OnGameAccountOnline(IRpcController controller, GameAccountOnlineNotification request, Action done) + + public override void OnGameAccountOnline(IRpcController controller, GameAccountOnlineNotification request, + Action done) { throw new NotImplementedException(); } - public override void PresenceChannelCreated(IRpcController controller, PresenceChannelCreatedRequest request, Action done) + + public override void PresenceChannelCreated(IRpcController controller, PresenceChannelCreatedRequest request, + Action done) { throw new NotImplementedException(); } - public override void ProcessServerRequest(IRpcController controller, ServerRequest request, Action done) + + public override void ProcessServerRequest(IRpcController controller, ServerRequest request, + Action done) { throw new NotImplementedException(); } + #endregion #region Diablo 3 + #region Rating system + private ByteString GetRatingPersonal(BattleClient client, ByteString data) { - var request = D3.GameMessage.LeaderboardGetHeroSnapshot.ParseFrom(data); - var response = D3.GameMessage.LeaderboardGetHeroSnapshotResponse.CreateBuilder(); + var request = LeaderboardGetHeroSnapshot.ParseFrom(data); + var response = LeaderboardGetHeroSnapshotResponse.CreateBuilder(); bool season = false; bool hardcore = false; ToonClass neededClass = 0; @@ -483,13 +581,27 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { case 1: break; - case 2: neededClass = ToonClass.Barbarian; break; // Barbarian - case 3: neededClass = ToonClass.Crusader; break; // Crusader - case 4: neededClass = ToonClass.DemonHunter; break; // Demon Hunter - case 5: neededClass = ToonClass.Monk; break; // Monk - case 6: neededClass = ToonClass.WitchDoctor; break; // Witch Doctor - case 7: neededClass = ToonClass.Wizard; break; // Wizard - case 8: neededClass = ToonClass.Necromancer; break; // Necromancer + case 2: + neededClass = ToonClass.Barbarian; + break; // Barbarian + case 3: + neededClass = ToonClass.Crusader; + break; // Crusader + case 4: + neededClass = ToonClass.DemonHunter; + break; // Demon Hunter + case 5: + neededClass = ToonClass.Monk; + break; // Monk + case 6: + neededClass = ToonClass.WitchDoctor; + break; // Witch Doctor + case 7: + neededClass = ToonClass.Wizard; + break; // Wizard + case 8: + neededClass = ToonClass.Necromancer; + break; // Necromancer case 10: // deuces break; @@ -508,16 +620,26 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services default: break; } + switch (request.ScopeId) { case 3: break; //Normal - case 2: hardcore = true; break; //Hardcore - case 5: season = true; break; //Seasonal - case 4: season = true; hardcore = true; break; //Hardcore and Seasonal + case 2: + hardcore = true; + break; //Hardcore + case 5: + season = true; + break; //Seasonal + case 4: + season = true; + hardcore = true; + break; //Hardcore and Seasonal } - List gameAccounts = DBSessions.SessionQuery().Where(a => a.Id == request.GameAccountId).ToList(); - var heroes = ToonManager.GetToonsForGameAccount(GameAccountManager.GetGameAccountByDBGameAccount(gameAccounts[0])); + List gameAccounts = DBSessions.SessionQuery() + .Where(a => a.Id == request.GameAccountId).ToList(); + var heroes = + ToonManager.GetToonsForGameAccount(GameAccountManager.GetGameAccountByDBGameAccount(gameAccounts[0])); Toon hero = null; byte upLevel = 0; int idx = -1; @@ -525,68 +647,101 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { for (int i = 0; i < heroes.Count; i++) { - if (season && !heroes[i].isSeassoned) continue; + if (season && !heroes[i].IsSeasoned) continue; if (hardcore && !heroes[i].IsHardcore) continue; if (heroes[i].Class != neededClass && (uint)neededClass != 0) continue; if (upLevel > heroes[i].Level) continue; upLevel = heroes[i].Level; idx = i; } + if (idx > -1) hero = heroes[idx]; } + if (hero != null) { var Snapshot = D3.Leaderboard.HeroSnapshot.CreateBuilder() - .SetHeroId(hero.D3EntityID) - .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(1).SetGbid(hero.Cosmetic1)) - .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(2).SetGbid(hero.Cosmetic2)) - .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(3).SetGbid(hero.Cosmetic3)) - .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(4).SetGbid(hero.Cosmetic4)) - .SetActiveSkills(SkillsWithRunes.CreateBuilder() - .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill0).SetRuneType(hero.DBActiveSkills.Rune0)) - .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill1).SetRuneType(hero.DBActiveSkills.Rune1)) - .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill2).SetRuneType(hero.DBActiveSkills.Rune2)) - .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill3).SetRuneType(hero.DBActiveSkills.Rune3)) - .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill4).SetRuneType(hero.DBActiveSkills.Rune4)) - .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill5).SetRuneType(hero.DBActiveSkills.Rune5))) - .SetActiveTraits(PassiveSkills.CreateBuilder().AddSnoTraits(hero.DBActiveSkills.Passive0).AddSnoTraits(hero.DBActiveSkills.Passive1).AddSnoTraits(hero.DBActiveSkills.Passive2).AddSnoTraits(hero.DBActiveSkills.Passive3)); + .SetHeroId(hero.D3EntityID) + .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(1) + .SetGbid(hero.Cosmetic1)) + .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(2) + .SetGbid(hero.Cosmetic2)) + .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(3) + .SetGbid(hero.Cosmetic3)) + .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(4) + .SetGbid(hero.Cosmetic4)) + .SetActiveSkills(SkillsWithRunes.CreateBuilder() + .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill0) + .SetRuneType(hero.DBActiveSkills.Rune0)) + .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill1) + .SetRuneType(hero.DBActiveSkills.Rune1)) + .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill2) + .SetRuneType(hero.DBActiveSkills.Rune2)) + .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill3) + .SetRuneType(hero.DBActiveSkills.Rune3)) + .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill4) + .SetRuneType(hero.DBActiveSkills.Rune4)) + .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill5) + .SetRuneType(hero.DBActiveSkills.Rune5))) + .SetActiveTraits(PassiveSkills.CreateBuilder().AddSnoTraits(hero.DBActiveSkills.Passive0) + .AddSnoTraits(hero.DBActiveSkills.Passive1).AddSnoTraits(hero.DBActiveSkills.Passive2) + .AddSnoTraits(hero.DBActiveSkills.Passive3)); foreach (var item in hero.Profile.Equipment.ItemsList) { int pos = 0; switch ((item.ItemSlot - 272) / 16) { - case 1: pos = 0; break; //0 - Helmet - case 2: pos = 1; break; //1 - Armor - case 3: pos = 5; break; //5 - Shield - case 4: pos = 4; break; //4 - Main hand - case 5: pos = 3; break; //3 - Gloves + case 1: + pos = 0; + break; //0 - Helmet + case 2: + pos = 1; + break; //1 - Armor + case 3: + pos = 5; + break; //5 - Shield + case 4: + pos = 4; + break; //4 - Main hand + case 5: + pos = 3; + break; //3 - Gloves //case 6: pos = 8; break; // - belt - case 7: pos = 2; break; //2 - Boots - case 8: pos = 6; break; //6 - Shoulders - case 9: pos = 7; break; //7 - Pants - default: + case 7: + pos = 2; + break; //2 - Boots + case 8: + pos = 6; + break; //6 - Shoulders + case 9: + pos = 7; + break; //7 - Pants + default: int s = (item.ItemSlot - 272) / 16; pos = 9; break; } + Snapshot.AddEquippedItems(D3.Leaderboard.HeroEquippedItem.CreateBuilder() .SetGenerator(item.Generator) .SetVisualInventorySlot(pos) - ); - - } + ); + } + ; //Snapshot.AddEquippedItems(D3.Leaderboard.HeroEquippedItem.CreateBuilder()); response.SetSnapshot(Snapshot); } + return response.Build().ToByteString(); } + private ByteString GetRatingAlt(BattleClient client, ByteString data) { - var request = D3.GameMessage.LeaderboardFetchScores.ParseFrom(data); + var request = LeaderboardFetchScores.ParseFrom(data); var response = LeaderboardFetchScoresResponse.CreateBuilder(); bool season = false; bool hardcore = false; @@ -595,13 +750,27 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { case 1: break; - case 2: neededClass = ToonClass.Barbarian; break; // Barbarian. - case 3: neededClass = ToonClass.Crusader; break; // Crusader. - case 4: neededClass = ToonClass.DemonHunter; break; // Demon Hunter. - case 5: neededClass = ToonClass.Monk; break; // Monk. - case 6: neededClass = ToonClass.WitchDoctor; break; // Warlock. - case 7: neededClass = ToonClass.Wizard; break; // Wizard. - case 8: neededClass = ToonClass.Necromancer; break; // Necromancer. + case 2: + neededClass = ToonClass.Barbarian; + break; // Barbarian. + case 3: + neededClass = ToonClass.Crusader; + break; // Crusader. + case 4: + neededClass = ToonClass.DemonHunter; + break; // Demon Hunter. + case 5: + neededClass = ToonClass.Monk; + break; // Monk. + case 6: + neededClass = ToonClass.WitchDoctor; + break; // Warlock. + case 7: + neededClass = ToonClass.Wizard; + break; // Wizard. + case 8: + neededClass = ToonClass.Necromancer; + break; // Necromancer. case 10: // ToonClass. break; @@ -616,25 +785,33 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services default: break; } + switch (request.ScopeId) { case 3: break; //Normal - case 2: hardcore = true; break; //Hardcore - case 5: season = true; break; //Seasonal - case 4: season = true; hardcore = true; break; //Seasonal Hardcore + case 2: + hardcore = true; + break; //Hardcore + case 5: + season = true; + break; //Seasonal + case 4: + season = true; + hardcore = true; + break; //Seasonal Hardcore } //foreach (var gameaccount in request.GameAccountIdsList) - + //var DBGA = DBSessions.SessionQuery().Where(a => a.Id == gameaccount).First(); List preGameAccounts = DBSessions.SessionQuery().ToList(); - - + + foreach (var gameAccountId in request.GameAccountIdsList) { - DBGameAccount gameAccount = DBSessions.SessionQuery().First(a => a.Id == gameAccountId); - var Heroes = ToonManager.GetToonsForGameAccount(GameAccountManager.GetGameAccountByDBGameAccount(gameAccount)); + var Heroes = + ToonManager.GetToonsForGameAccount(GameAccountManager.GetGameAccountByDBGameAccount(gameAccount)); Toon Hero = null; byte upLevel = 0; int idx = -1; @@ -642,79 +819,86 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { for (int i = 0; i < Heroes.Count; i++) { - if (season && !Heroes[i].isSeassoned) continue; + if (season && !Heroes[i].IsSeasoned) continue; if (hardcore && !Heroes[i].IsHardcore) continue; - if (Heroes[i].Class != neededClass && neededClass != ToonClass.Unknown) continue; + if (Heroes[i].Class != neededClass && neededClass != ToonClass.Unknown) continue; if (upLevel > Heroes[i].Level) continue; upLevel = Heroes[i].Level; idx = i; } + if (idx > -1) Hero = Heroes[idx]; } + if (Hero != null) try { GameAccount gameAccount2 = GameAccountManager.GetGameAccountByDBGameAccount(gameAccount); Account account = AccountManager.GetAccountByPersistentID(gameAccount2.AccountId); var member = D3.Leaderboard.Member.CreateBuilder() - .SetAccountId(gameAccount2.AccountId) - .SetHeroSeasonCreated((uint)Hero.SeasonCreated) - .SetBattleTag(account.BattleTagName) - .SetHeroAltLevel((uint)gameAccount2.DBGameAccount.ParagonLevel) - .SetHeroFlags((uint)Hero.Flags) - .SetHeroLevel((uint)Hero.Level) - .SetHeroGbidClass((uint)Hero.ClassID) - .SetHeroName(Hero.Name) - .SetHeroSnapshotAvailable(true) - .SetHeroVisualEquipment(gameAccount2.Toons[0].Digest.VisualEquipment); + .SetAccountId(gameAccount2.AccountId) + .SetHeroSeasonCreated((uint)Hero.SeasonCreated) + .SetBattleTag(account.BattleTagName) + .SetHeroAltLevel((uint)gameAccount2.DBGameAccount.ParagonLevel) + .SetHeroFlags((uint)Hero.Flags) + .SetHeroLevel((uint)Hero.Level) + .SetHeroGbidClass((uint)Hero.ClassID) + .SetHeroName(Hero.Name) + .SetHeroSnapshotAvailable(true) + .SetHeroVisualEquipment(gameAccount2.Toons[0].Digest.VisualEquipment); if (gameAccount2.Clan != null) { - member.SetClanId(gameAccount2.Clan.GuildId.GuildId_).SetClanTag(gameAccount2.Clan.Prefix).SetClanName(gameAccount2.Clan.Name); + member.SetClanId(gameAccount2.Clan.GuildId.GuildId_).SetClanTag(gameAccount2.Clan.Prefix) + .SetClanName(gameAccount2.Clan.Name); } + response .AddEntry(D3.Leaderboard.Score.CreateBuilder() - .SetGameAccountId(gameAccount2.AccountId) - .SetScore_((ulong)Hero.Level + (ushort)gameAccount2.DBGameAccount.ParagonLevel) // Temporary Separation. - .SetScoreBand(5) - .SetLeaderboardId(5) - .SetScopeId(5) - .SetTimestamp(DateTimeExtensions.ToUnixTime(DateTime.UtcNow)) - .SetMetadata(D3.Leaderboard.Metadata.CreateBuilder() - .SetAct1TimeMs(0) - .SetAct2TimeMs(0) - .SetAct3TimeMs(0) - .SetAct4TimeMs(0) - .SetAct5TimeMs(0) - .SetLevelSeed(0) - .SetCheated(false) - .AddTeamMember(member) - .SetChallengeData(D3.Leaderboard.WeeklyChallengeData.CreateBuilder() - .SetBnetAccountId(unchecked((uint)account.BnetEntityId.Low)) - .SetGameAccountId(GameAccountHandle.CreateBuilder().SetId(unchecked((uint)gameAccount2.BnetEntityId.Low)).SetProgram(17459).SetRegion(1)) - .SetHeroSnapshot(D3.Hero.SavedDefinition.CreateBuilder().SetVersion(905) + .SetGameAccountId(gameAccount2.AccountId) + .SetScore_((ulong)Hero.Level + + (ushort)gameAccount2.DBGameAccount.ParagonLevel) // Temporary Separation. + .SetScoreBand(5) + .SetLeaderboardId(5) + .SetScopeId(5) + .SetTimestamp(DateTimeExtensions.ToUnixTime(DateTime.UtcNow)) + .SetMetadata(D3.Leaderboard.Metadata.CreateBuilder() + .SetAct1TimeMs(0) + .SetAct2TimeMs(0) + .SetAct3TimeMs(0) + .SetAct4TimeMs(0) + .SetAct5TimeMs(0) + .SetLevelSeed(0) + .SetCheated(false) + .AddTeamMember(member) + .SetChallengeData(D3.Leaderboard.WeeklyChallengeData.CreateBuilder() + .SetBnetAccountId(unchecked((uint)account.BnetEntityId.Low)) + .SetGameAccountId(GameAccountHandle.CreateBuilder() + .SetId(unchecked((uint)gameAccount2.BnetEntityId.Low)).SetProgram(17459) + .SetRegion(1)) + .SetHeroSnapshot(D3.Hero.SavedDefinition.CreateBuilder().SetVersion(905) .SetDigest(Hero.Digest) .SetSavedAttributes(D3.AttributeSerializer.SavedAttributes.CreateBuilder())) - .SetAccountSnapshot(D3.Account.SavedDefinition.CreateBuilder().SetVersion(905) - .SetDigest(gameAccount2.Digest)) - .SetRiftSnapshot(D3.Leaderboard.RiftSnapshot.CreateBuilder() - .SetRiftSeed(2342341) - .SetRiftTier(1) - .SetSnoDungeonFinder(1) - .SetSnoBoss(1) - .SetDeprecatedCompletionSeconds(10) - .SetNumDeaths(1))) + .SetAccountSnapshot(D3.Account.SavedDefinition.CreateBuilder().SetVersion(905) + .SetDigest(gameAccount2.Digest)) + .SetRiftSnapshot(D3.Leaderboard.RiftSnapshot.CreateBuilder() + .SetRiftSeed(2342341) + .SetRiftTier(1) + .SetSnoDungeonFinder(1) + .SetSnoBoss(1) + .SetDeprecatedCompletionSeconds(10) + .SetNumDeaths(1))) )); - - } catch (Exception ex) { Logger.ErrorException(ex, "Error while creating leaderboard entry"); } } + return response.Build().ToByteString(); } + private ByteString GetRating(BattleClient client, ByteString data) { LeaderboardList request = LeaderboardList.ParseFrom(data); @@ -723,15 +907,29 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services ToonClass neededClass = ToonClass.Unknown; switch (request.LeaderboardId) { - case 1: + case 1: break; - case 2: neededClass = ToonClass.Barbarian; break; // Barbarian - case 3: neededClass = ToonClass.Crusader; break; // Crusader - case 4: neededClass = ToonClass.DemonHunter; break; // Demon Hunter - case 5: neededClass = ToonClass.Monk; break; // Monk - case 6: neededClass = ToonClass.WitchDoctor; break; // Witch Doctor - case 7: neededClass = ToonClass.Wizard; break; // Wizard - case 8: neededClass = ToonClass.Necromancer; break; // Necromancer + case 2: + neededClass = ToonClass.Barbarian; + break; // Barbarian + case 3: + neededClass = ToonClass.Crusader; + break; // Crusader + case 4: + neededClass = ToonClass.DemonHunter; + break; // Demon Hunter + case 5: + neededClass = ToonClass.Monk; + break; // Monk + case 6: + neededClass = ToonClass.WitchDoctor; + break; // Witch Doctor + case 7: + neededClass = ToonClass.Wizard; + break; // Wizard + case 8: + neededClass = ToonClass.Necromancer; + break; // Necromancer case 10: // Duples break; @@ -746,18 +944,26 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services default: break; } + switch (request.ScopeId) { case 3: break; //Normal - case 2: hardcore = true; break; //Hardcore - case 5: season = true; break; //Seasonal - case 4: season = true; hardcore = true; break; //Seasonal + Harcore + case 2: + hardcore = true; + break; //Hardcore + case 5: + season = true; + break; //Seasonal + case 4: + season = true; + hardcore = true; + break; //Seasonal + Harcore } var result = LeaderboardListResponse.CreateBuilder() - .SetLimit(request.Limit) - .SetOffset(request.Offset) - .SetVersion(request.Version) + .SetLimit(request.Limit) + .SetOffset(request.Offset) + .SetVersion(request.Version) ; List gameAccounts = DBSessions.SessionQuery().ToList(); @@ -772,7 +978,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { for (int i = 0; i < toons.Count; i++) { - if (season && !toons[i].isSeassoned) continue; + if (season && !toons[i].IsSeasoned) continue; if (hardcore && !toons[i].IsHardcore) continue; if (toons[i].Class != neededClass && neededClass != ToonClass.Unknown) continue; if (upLevel > toons[i].Level) continue; @@ -820,7 +1026,6 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .SetAct4TimeMs(0) .SetAct5TimeMs(0) .SetLevelSeed(1) - .SetChallengeData(D3.Leaderboard.WeeklyChallengeData.CreateBuilder() .SetBnetAccountId(unchecked((uint)account.BnetEntityId.Low)) .SetGameAccountId(GameAccountHandle.CreateBuilder() @@ -860,8 +1065,11 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services result.SetTotalLeaderboardEntries((uint)gameAccounts.Count); return result.Build().ToByteString(); } + #endregion + #region Character List Request + private ByteString OnHeroDigestListRequest(BattleClient client, ByteString data) { HeroDigestListRequest request = HeroDigestListRequest.ParseFrom(data); @@ -870,10 +1078,14 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { builder.AddDigestList(ToonManager.GetToonByLowID(toon).Digest); } + return builder.Build().ToByteString(); } + #endregion + #region Create/Delete/Switch Character + private ByteString OnHeroCreateParams(BattleClient client, ByteString data) { HeroCreateParams createParams = HeroCreateParams.ParseFrom(data); @@ -883,9 +1095,12 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services // return null; //var newToon = ToonManager.CreateNewToon(createPrams.Name, createPrams.GbidClass, createPrams.IsHardcore, createPrams.IsFemale ? 0x02 : (uint)0x00, 1, Client.Account.GameAccount, createPrams.IsSeason ? (uint)1 : (uint)0); - var newToon = ToonManager. CreateNewToon(createParams.Name, createParams.GbidClass, createParams.IsFemale ? ToonFlags.Female : ToonFlags.Male, 1, createParams.IsHardcore, client.Account.GameAccount, createParams.IsSeason ? 1 : 0); + var newToon = ToonManager.CreateNewToon(createParams.Name, createParams.GbidClass, + createParams.IsFemale ? ToonFlags.Female : ToonFlags.Male, 1, createParams.IsHardcore, + client.Account.GameAccount, createParams.IsSeason ? 1 : 0); return CreateHeroResponse.CreateBuilder().SetHeroId(newToon.D3EntityID.IdLow).Build().ToByteString(); } + private ByteString OnHeroDeleteParams(BattleClient client, ByteString data) { var deleteParams = DeleteHero.ParseFrom(data); @@ -893,9 +1108,10 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services ToonManager.DeleteToon(toon); return ByteString.Empty; } + private ByteString SwitchCharRequest(BattleClient client, ByteString data) { - var request = D3.GameMessage.GetToonSettings.ParseFrom(data); + var request = GetToonSettings.ParseFrom(data); var oldToon = client.Account.GameAccount.CurrentToon; var newToon = ToonManager.GetToonByLowID(request.HeroId); @@ -908,11 +1124,14 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services //Client.Account.GameAccount.Setted = true; } - var response = D3.GameMessage.SelectHero.CreateBuilder().SetHeroId(request.HeroId); + var response = SelectHero.CreateBuilder().SetHeroId(request.HeroId); return response.Build().ToByteString(); } + #endregion + #region Login initialization + private ByteString OnInitialLoginDataRequest(BattleClient client, ByteString data) { var req = InitialLoginDataRequest.ParseFrom(data); @@ -923,8 +1142,11 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return res.Build().ToByteString(); } + #endregion + #region Banner editing + private bool SaveBanner(BattleClient client, ByteString data) { Logger.Debug("SaveBannerConfiguration()"); @@ -940,15 +1162,17 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } return true; - } + #endregion + #region Guild system private ByteString CreateGuild(BattleClient client, ByteString data) { GuildCreate request = GuildCreate.ParseFrom(data); - var guild = GuildManager.CreateNewGuild(client.Account.GameAccount, request.Name, request.Tag, true, 0, request.LookingForMembers, request.Language); + var guild = GuildManager.CreateNewGuild(client.Account.GameAccount, request.Name, request.Tag, true, 0, + request.LookingForMembers, request.Language); if (guild != null) { return guild.GuildId.ToByteString(); @@ -956,6 +1180,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services else return ByteString.Empty; } + private ByteString SearchGuilds(BattleClient client, ByteString data) { GuildSearch request = GuildSearch.ParseFrom(data); @@ -1011,6 +1236,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return ByteString.Empty; } + private void AcceptInviteToGuild(BattleClient client, GuildInviteResponse request) { var guild = GuildManager.GetGuildById(request.GuildId); @@ -1031,7 +1257,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } } } - private void GuildKickMemberP(BattleClient client, D3.GameMessage.GuildKickMember request) + + private void GuildKickMemberP(BattleClient client, GuildKickMember request) { Logger.Debug("GuildKickMember(): {0}", request.ToString()); @@ -1041,9 +1268,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var gameAccount = GameAccountManager.GetAccountByPersistentID(request.MemberId); guild.RemoveMember(gameAccount); } - } - private void GuildDisband(BattleClient client, D3.GameMessage.GuildId request) + + private void GuildDisband(BattleClient client, GuildId request) { Logger.Debug("GuildDisband(): {0}", request.ToString()); @@ -1053,12 +1280,13 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services guild.Disband(); } } + private ByteString ExitFromGuild(BattleClient client, ByteString data) { - return ByteString.Empty; } - private ByteString GuildFetchNews(BattleClient client, D3.GameMessage.GuildFetchNews request) + + private ByteString GuildFetchNews(BattleClient client, GuildFetchNews request) { Logger.Debug("GuildFetchNews(): {0}", request.ToString()); var builder = D3.Guild.NewsList.CreateBuilder(); @@ -1081,19 +1309,21 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services foreach (var news in guild_news) { if (news.Time < request.NewsTime) continue; - var post = D3.Guild.News.CreateBuilder().SetNewsId(news.Id).SetAccountId(news.DBGameAccount.Id).SetNewsType((uint)news.Type).SetNewsTime(news.Time); + var post = D3.Guild.News.CreateBuilder().SetNewsId(news.Id).SetAccountId(news.DBGameAccount.Id) + .SetNewsType((uint)news.Type).SetNewsTime(news.Time); if (news.Type < 2 || news.Type == 8) post.SetNewsData(ByteString.CopyFrom(news.Data)); builder.AddNewsProp(post); //builder.AddPosts(post); } + return builder.Build().ToByteString(); } else return ByteString.Empty; } - private ByteString GuildPromoteMember(BattleClient client, D3.GameMessage.GuildPromoteMember request) + private ByteString GuildPromoteMember(BattleClient client, GuildPromoteMember request) { Logger.Debug("GuildPromoteMember(): {0}", request.ToString()); @@ -1114,7 +1344,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return ByteString.Empty; } - private ByteString GuildDemoteMember(BattleClient client, D3.GameMessage.GuildDemoteMember request) + private ByteString GuildDemoteMember(BattleClient client, GuildDemoteMember request) { Logger.Debug("GuildDemoteMember(): {0}", request.ToString()); @@ -1138,7 +1368,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services private ByteString InviteToGuild(BattleClient client, ByteString data) { GuildInvite request = GuildInvite.ParseFrom(data); - + ; var guild = GuildManager.GetGuildById(request.GuildId); if (guild != null) @@ -1149,7 +1379,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return ByteString.Empty; } - private void GuildSetMOTD(BattleClient client, D3.GameMessage.GuildSetMotd request) + + private void GuildSetMOTD(BattleClient client, GuildSetMotd request) { var guild = GuildManager.GetGuildById(request.GuildId); if (guild != null && guild.HasMember(client.Account.GameAccount)) @@ -1162,15 +1393,15 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } } - private void GuildSetNews(BattleClient client, D3.GameMessage.GuildSetNews request) + private void GuildSetNews(BattleClient client, GuildSetNews request) { - var guild = GuildManager.GetGuildById(request.GuildId); + var guild = GuildManager.GetGuildById(request.GuildId); if (guild != null && guild.HasMember(client.Account.GameAccount)) { guild.AddNews(client.Account.GameAccount, 8, request.NewsData.ToByteArray()); } - } + private ByteString GuildInvit(BattleClient client, ByteString data) { var test = GuildInvite.ParseFrom(data); @@ -1184,9 +1415,11 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var gameAccount = GameAccountManager.GetAccountByPersistentID(acc.CurrentGameAccountId); gameAccount.InviteToGuild(guild, client.Account.GameAccount); } + return ByteString.Empty; } - private ByteString GuildSuggest(BattleClient client, D3.GameMessage.GuildSuggest request) + + private ByteString GuildSuggest(BattleClient client, GuildSuggest request) { var gameAccount = GameAccountManager.GetAccountByPersistentID(request.OtherAccountId); @@ -1203,11 +1436,12 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .SetInviteType(1U) .SetExpireTime(3600).Build().ToByteString(); } + return ByteString.Empty; } - private void GuildSetDescription(BattleClient client, D3.GameMessage.GuildSetDescription request) + + private void GuildSetDescription(BattleClient client, GuildSetDescription request) { - var guild = GuildManager.GetGuildById(request.GuildId); if (guild != null && guild.HasMember(client.Account.GameAccount)) { @@ -1218,7 +1452,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services guild.AddNews(client.Account.GameAccount, 6); } } - private void GuildSuggestionResponse(BattleClient client, D3.GameMessage.GuildSuggestionResponse request) + + private void GuildSuggestionResponse(BattleClient client, GuildSuggestionResponse request) { var builder = D3.GameMessage.GuildSuggestionResponse.CreateBuilder(); var gameAccount = GameAccountManager.GetAccountByPersistentID(request.InviteeId); @@ -1232,7 +1467,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services gameAccount.InviteToGuild(guild, client.Account.GameAccount); } } - private ByteString GetInviteList(BattleClient client, D3.GameMessage.GuildId guild_id) + + private ByteString GetInviteList(BattleClient client, GuildId guild_id) { var builder = D3.Guild.InviteList.CreateBuilder(); @@ -1246,9 +1482,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services else return ByteString.Empty; } - private void GuildCancelInvite(BattleClient client, D3.GameMessage.GuildCancelInvite request) + + private void GuildCancelInvite(BattleClient client, GuildCancelInvite request) { - var guild = GuildManager.GetGuildById(request.GuildId); if (guild != null) { @@ -1257,9 +1493,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services guild.GuildSuggestions.RemoveAll(i => i.AccountId == request.AccountId); } } - private void GuildLFM(BattleClient client, D3.GameMessage.GuildSetLFM request) + + private void GuildLFM(BattleClient client, GuildSetLFM request) { - var guild = GuildManager.GetGuildById(request.GuildId); if (guild != null && guild.HasMember(client.Account.GameAccount)) { @@ -1269,14 +1505,15 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services DBSessions.SessionUpdate(dbGuild); guild.UpdateChannelAttributes(); } - } + private ByteString CreateCommunity(BattleClient client, ByteString data) { var request = GroupCreate.ParseFrom(data); Logger.Debug("CreateCommunity(): {0}", request.ToString()); - var guild = GuildManager.CreateNewGuild(client.Account.GameAccount, request.Name, "", false, request.SearchCategory, false, request.Language); + var guild = GuildManager.CreateNewGuild(client.Account.GameAccount, request.Name, "", false, + request.SearchCategory, false, request.Language); if (guild != null) { return guild.GuildId.ToByteString(); @@ -1284,11 +1521,14 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services else return ByteString.Empty; } + #endregion + #region Account statistics + private ByteString CollectProfiles(BattleClient client, ByteString data) { - var request = D3.GameMessage.GetAccountProfile.ParseFrom(data); + var request = GetAccountProfile.ParseFrom(data); var account = GameAccountManager.GetAccountByPersistentID(request.AccountId.Id); if (request.SeasonId != 0) { @@ -1296,14 +1536,13 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } else { - return account.Profile.ToByteString(); } - } + private ByteString CollectAchivementsSnapshot(BattleClient client, ByteString data) { - var request = D3.GameMessage.AchievementsGetSnapshot.ParseFrom(data); + var request = AchievementsGetSnapshot.ParseFrom(data); var snapshot = D3.Achievements.Snapshot.CreateBuilder(); foreach (var achievement in client.Account.GameAccount.Achievements) @@ -1318,8 +1557,10 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services ); //*/ } + snapshot.AddAchievementSnapshot(achievement); } + foreach (var criteria in client.Account.GameAccount.AchievementCriteria) { uint countOfTravels = 0; @@ -1329,304 +1570,592 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } - return AchievementsSnapshot.CreateBuilder().SetErrorCode(0).SetGameAccountId(request.GameAccountId).SetSnapshot(snapshot).Build().ToByteString(); + return AchievementsSnapshot.CreateBuilder().SetErrorCode(0).SetGameAccountId(request.GameAccountId) + .SetSnapshot(snapshot).Build().ToByteString(); } #endregion + #region Collection and store + private ByteString GetCollectionAccout(BattleClient client, ByteString data) { var C = D3.CosmeticItems.CosmeticItems.CreateBuilder(); + #region All items - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587061))); // Angelic - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587101))); // Aranea - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2586361111))); // Barbarian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2350702305))); // Base Frame - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2608693639))); // Blood Shard - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2608693641))); // Blood Shard))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2608693643))); // Blood Shard))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2608693642))); // Blood Shard))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2608693644))); // Blood Shard))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2608693640))); // Blood Shard))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587063))); // Bone - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587102))); // Caldeum - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)789315589))); // Call to Adventure - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)789315590))); // Call to Adventure))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)789315591))); // Call to Adventure))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)789315593))); // Call to Adventure))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)789315592))); // Call to Adventure))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)789315594))); // Call to Adventure))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3111787208))); // Classic Angel - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3115028404))); // Classic Demon - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1666320302))); // Crusader - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587062))); // Deathshead - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1834718654))); // Demon Hunter - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)949147387))); // Eternal Conflict - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)949147388))); // Eternal Conflict))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)949147389))); // Eternal Conflict))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)949147391))); // Eternal Conflict))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)949147390))); // Eternal Conflict))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)949147392))); // Eternal Conflict))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)466824271))); // Eternal Woods - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)466824272))); // Eternal Woods))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)466824273))); // Eternal Woods))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)466824275))); // Eternal Woods))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)466824274))); // Eternal Woods))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)466824276))); // Eternal Woods))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914281823))); // Greyhollow - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914281824))); // Greyhollow))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914281825))); // Greyhollow))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914281827))); // Greyhollow))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914281826))); // Greyhollow))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914281828))); // Greyhollow))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587099))); // Heart of Darkness - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)409592463))); // Heaven - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)409592464))); // Heaven))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)409592465))); // Heaven))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)409592467))); // Heaven))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)409592466))); // Heaven))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)409592468))); // Heaven))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)586020310))); // Hell - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)586020311))); // Hell))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)586020312))); // Hell))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)586020313))); // Hell))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)586020314))); // Hell))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)586020315))); // Hell))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2174954790))); // Imperius - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2174954791))); // Imperius))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2174954792))); // Imperius))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2174954794))); // Imperius))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2174954793))); // Imperius))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2174954795))); // Imperius))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)4111980878))); // Industrial - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587128))); // Jade Serpent - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587066))); // Molten - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)423580970))); // Monk - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1094085036))); // Necromancer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)604200072))); // Overwatch - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2129557709))); // Pandemonium - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2129557710))); // Pandemonium))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2129557711))); // Pandemonium))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2129557713))); // Pandemonium))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2129557712))); // Pandemonium))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2129557714))); // Pandemonium))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2350702306))); // Paragon 1 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263764818))); // Paragon 10 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114304450))); // Paragon 100 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263764851))); // Paragon 20 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114305539))); // Paragon 200 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263764884))); // Paragon 30 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114306628))); // Paragon 300 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263764917))); // Paragon 40 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114307717))); // Paragon 400 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263764950))); // Paragon 50 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114308806))); // Paragon 500 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263764983))); // Paragon 60 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114309895))); // Paragon 600 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263765016))); // Paragon 70 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114310984))); // Paragon 700 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263765049))); // Paragon 80 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)114312073))); // Paragon 800 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)263765082))); // Paragon 90 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1103438361))); // Portrait of Valor - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587097))); // Season 3 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914245886))); // Season 4 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914245888))); // Season 4))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914245890))); // Season 4))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914245889))); // Season 4))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914245891))); // Season 4))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2914245887))); // Season 4))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587127))); // Sescheron - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)360887075))); // Soulstone - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)360887077))); // Soulstone))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)360887079))); // Soulstone))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)360887078))); // Soulstone))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)360887080))); // Soulstone))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)360887076))); // Soulstone))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587068))); // Stained Glass))); // Azure - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587094))); // Stained Glass))); // Orange - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587095))); // Stained Glass))); // Purple - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587069))); // Stained Glass))); // Red - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587067))); // Stained Glass))); // Teal - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587093))); // Stained Glass))); // Yellow - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587098))); // Storm - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1898911879))); // Tal Rasha - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1898911880))); // Tal Rasha))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1898911881))); // Tal Rasha))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1898911883))); // Tal Rasha))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1898911882))); // Tal Rasha))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1898911884))); // Tal Rasha))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1079851844))); // Teganze Warrior - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587126))); // The Sign of Rakkis - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587064))); // Thorns - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3661137118))); // Treasure Goblin - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3661137119))); // Treasure Goblin))); // Slayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3661137120))); // Treasure Goblin))); // Champion - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3661137122))); // Treasure Goblin))); // Conqueror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3661137121))); // Treasure Goblin))); // Destroyer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3661137123))); // Treasure Goblin))); // Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)4140821779))); // Triforce - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2001444264))); // Twitch - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587100))); // Viper's Seal - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587096))); // Whimsyshire Portrait Frame - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2819867039))); // Witch Doctor - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2102838278))); // Wizard - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3526887646))); // Zandalari - //Pets - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2923223637))); // Bat - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)567166426))); // Angelic Goblin - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3358761128))); // Az-Lo - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3620943091))); // Belphegor - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)291388178))); // Bile Boy - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2767458423))); // Blaine's Bear - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1336361309))); // Blaze - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)988742338))); // Bones - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)291388177))); // Buddy - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)167459531))); // Butcher - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1497375554))); // Captain Maraca - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1209305989))); // Charlotte - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)937125523))); // Cucco - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1369935753))); // Diablo - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3922872439))); // Dominion's Revenge - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)471039389))); // Dream of Piers - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1404174869))); // Emerald Serpent - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3620943090))); // Friendly Gauntlet - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)291388175))); // Frost Hound - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2327409917))); // Galthrak the Unhinged - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3153829279))); // Garluth, Destroyer of Kneecaps - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)909568905))); // Grunkk - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3258626648))); // Half-formed Golem - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)4084520547))); // Haunting Hannah - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1336361310))); // Humbart Wessel - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1404174868))); // Iron Serpent - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1404174867))); // Jade Serpent - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3620943089))); // Knight Hand - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1508058349))); // Lady Morthanlu - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1967180567))); // Lamb - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3132731524))); // Liv Moore - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2767458419))); // Lord Kek La Mort - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1508058348))); // Lord Nedly - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)347688656))); // Malfeasance - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1514497706))); // Mal'Ganis - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1377380860))); // Minaca the Feared - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2767458418))); // Mr. Bear - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3430307999))); // Ms. Madeleine - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2401672920))); // Murkgoblin - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3870322527))); // Old Growth - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2767458421))); // Overseer Lady Josephine - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)517654224))); // Probe - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3094528011))); // Queen of the Succubi - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1168709051))); // Rocky - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1729774130))); // Royal Calf - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3919201454))); // Shadow Diablo - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)291388174))); // Spike - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2431587065))); // Steadfast - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1920516661))); // Stupendous Contraption - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3536793764))); // Tal'darim Probe - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2647152737))); // Ten Pounder - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2768450096))); // That Which Must Not be Named - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)291388179))); // The Black Dog - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3475456761))); // The Bumble - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)95923716))); // The Stomach - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)291388176))); // Tiger Hound - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)471039390))); // Unihorn - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2767458422))); // Xiansai Bear - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3620943088))); // Zayl's Loss - //Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3372877841))); // Knights of Westmarch - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1464422747))); // Blade Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)567892925))); // Anguish's Grasp - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2222542490))); // Auriel's Favor - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)702834904))); // Blue Horror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)702834901))); // Brimstone Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890384))); // Cosmic Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)702834903))); // Dark Bat - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1464422100))); // Demon Soaring - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)702834905))); // Dread - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2653514096))); // Echoes of the Mask - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)208405024))); // Eldritch Embrace - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3890992984))); // Embrace of the Pure One - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1464439640))); // Eternal Flame - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1081301157))); // Eternal Light - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1081297790))); // Falcon's Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)550271606))); // Fiacla-Géar - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)262300867))); // Fingers of Flame - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2479192435))); // Fingers of Terror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)546207131))); // Galactic - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)211305012))); // Harbinger of Destruction - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890379))); // Lady Gaki's Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3273442495))); // Lilith's Embrace - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890378))); // Lord Culsu's Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1335990173))); // Mercy's Gaze - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)702834906))); // Osseous Grasp - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)208454467))); // Pieces of Hatred - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2552747379))); // Prime Evil Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2764892181))); // Skeletal Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2029657407))); // Star Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)702834902))); // Sulfuric Tide - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2840660586))); // The Light of Heaven - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3297867693))); // The Mimic - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2222725144))); // The Pillars of Heaven - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)721772994))); // Trag'Oul Wings - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890383))); // Winds of Aldinach - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890380))); // Wings of Kokabiel - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890381))); // Wings of Lempo - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2036418836))); // Wings of Mastery - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)550271607))); // Wings of Northern Skies - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1905890382))); // Wings of Semyaz - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1185806158))); // Wings of Terror - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2590476058))); // Wings of the Betrayer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)726768249))); // Wings of the Crypt Guardian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)671128753))); // Wings of the Dedicated - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)4188235898))); // Wings of the Ghost Queen - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1030142027))); // Wings of Valor - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2015178386))); // Heaven's Might + + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587061))); // Angelic + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587101))); // Aranea + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2586361111))); // Barbarian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2350702305))); // Base Frame + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2608693639))); // Blood Shard + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2608693641))); // Blood Shard))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2608693643))); // Blood Shard))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2608693642))); // Blood Shard))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2608693644))); // Blood Shard))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2608693640))); // Blood Shard))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587063))); // Bone + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587102))); // Caldeum + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)789315589))); // Call to Adventure + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)789315590))); // Call to Adventure))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)789315591))); // Call to Adventure))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)789315593))); // Call to Adventure))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)789315592))); // Call to Adventure))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)789315594))); // Call to Adventure))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3111787208))); // Classic Angel + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3115028404))); // Classic Demon + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1666320302))); // Crusader + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587062))); // Deathshead + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1834718654))); // Demon Hunter + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)949147387))); // Eternal Conflict + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)949147388))); // Eternal Conflict))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)949147389))); // Eternal Conflict))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)949147391))); // Eternal Conflict))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)949147390))); // Eternal Conflict))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)949147392))); // Eternal Conflict))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)466824271))); // Eternal Woods + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)466824272))); // Eternal Woods))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)466824273))); // Eternal Woods))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)466824275))); // Eternal Woods))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)466824274))); // Eternal Woods))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)466824276))); // Eternal Woods))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914281823))); // Greyhollow + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914281824))); // Greyhollow))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914281825))); // Greyhollow))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914281827))); // Greyhollow))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914281826))); // Greyhollow))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914281828))); // Greyhollow))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587099))); // Heart of Darkness + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)409592463))); // Heaven + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)409592464))); // Heaven))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)409592465))); // Heaven))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)409592467))); // Heaven))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)409592466))); // Heaven))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)409592468))); // Heaven))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)586020310))); // Hell + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)586020311))); // Hell))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)586020312))); // Hell))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)586020313))); // Hell))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)586020314))); // Hell))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)586020315))); // Hell))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2174954790))); // Imperius + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2174954791))); // Imperius))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2174954792))); // Imperius))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2174954794))); // Imperius))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2174954793))); // Imperius))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2174954795))); // Imperius))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)4111980878))); // Industrial + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587128))); // Jade Serpent + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587066))); // Molten + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)423580970))); // Monk + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1094085036))); // Necromancer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)604200072))); // Overwatch + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2129557709))); // Pandemonium + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2129557710))); // Pandemonium))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2129557711))); // Pandemonium))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2129557713))); // Pandemonium))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2129557712))); // Pandemonium))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2129557714))); // Pandemonium))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2350702306))); // Paragon 1 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263764818))); // Paragon 10 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114304450))); // Paragon 100 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263764851))); // Paragon 20 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114305539))); // Paragon 200 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263764884))); // Paragon 30 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114306628))); // Paragon 300 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263764917))); // Paragon 40 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114307717))); // Paragon 400 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263764950))); // Paragon 50 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114308806))); // Paragon 500 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263764983))); // Paragon 60 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114309895))); // Paragon 600 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263765016))); // Paragon 70 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114310984))); // Paragon 700 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263765049))); // Paragon 80 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)114312073))); // Paragon 800 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)263765082))); // Paragon 90 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1103438361))); // Portrait of Valor + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587097))); // Season 3 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914245886))); // Season 4 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914245888))); // Season 4))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914245890))); // Season 4))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914245889))); // Season 4))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914245891))); // Season 4))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2914245887))); // Season 4))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587127))); // Sescheron + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)360887075))); // Soulstone + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)360887077))); // Soulstone))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)360887079))); // Soulstone))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)360887078))); // Soulstone))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)360887080))); // Soulstone))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)360887076))); // Soulstone))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587068))); // Stained Glass))); // Azure + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587094))); // Stained Glass))); // Orange + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587095))); // Stained Glass))); // Purple + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587069))); // Stained Glass))); // Red + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587067))); // Stained Glass))); // Teal + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587093))); // Stained Glass))); // Yellow + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587098))); // Storm + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1898911879))); // Tal Rasha + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1898911880))); // Tal Rasha))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1898911881))); // Tal Rasha))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1898911883))); // Tal Rasha))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1898911882))); // Tal Rasha))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1898911884))); // Tal Rasha))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1079851844))); // Teganze Warrior + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587126))); // The Sign of Rakkis + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587064))); // Thorns + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3661137118))); // Treasure Goblin + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3661137119))); // Treasure Goblin))); // Slayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3661137120))); // Treasure Goblin))); // Champion + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3661137122))); // Treasure Goblin))); // Conqueror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3661137121))); // Treasure Goblin))); // Destroyer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3661137123))); // Treasure Goblin))); // Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)4140821779))); // Triforce + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2001444264))); // Twitch + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587100))); // Viper's Seal + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587096))); // Whimsyshire Portrait Frame + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2819867039))); // Witch Doctor + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2102838278))); // Wizard + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3526887646))); // Zandalari + //Pets + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2923223637))); // Bat + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)567166426))); // Angelic Goblin + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3358761128))); // Az-Lo + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3620943091))); // Belphegor + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)291388178))); // Bile Boy + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2767458423))); // Blaine's Bear + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1336361309))); // Blaze + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)988742338))); // Bones + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)291388177))); // Buddy + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)167459531))); // Butcher + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1497375554))); // Captain Maraca + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1209305989))); // Charlotte + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)937125523))); // Cucco + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1369935753))); // Diablo + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3922872439))); // Dominion's Revenge + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)471039389))); // Dream of Piers + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1404174869))); // Emerald Serpent + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3620943090))); // Friendly Gauntlet + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)291388175))); // Frost Hound + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2327409917))); // Galthrak the Unhinged + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3153829279))); // Garluth, Destroyer of Kneecaps + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)909568905))); // Grunkk + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3258626648))); // Half-formed Golem + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)4084520547))); // Haunting Hannah + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1336361310))); // Humbart Wessel + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1404174868))); // Iron Serpent + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1404174867))); // Jade Serpent + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3620943089))); // Knight Hand + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1508058349))); // Lady Morthanlu + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1967180567))); // Lamb + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3132731524))); // Liv Moore + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2767458419))); // Lord Kek La Mort + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1508058348))); // Lord Nedly + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)347688656))); // Malfeasance + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1514497706))); // Mal'Ganis + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1377380860))); // Minaca the Feared + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2767458418))); // Mr. Bear + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3430307999))); // Ms. Madeleine + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2401672920))); // Murkgoblin + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3870322527))); // Old Growth + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2767458421))); // Overseer Lady Josephine + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)517654224))); // Probe + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3094528011))); // Queen of the Succubi + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1168709051))); // Rocky + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1729774130))); // Royal Calf + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3919201454))); // Shadow Diablo + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)291388174))); // Spike + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2431587065))); // Steadfast + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1920516661))); // Stupendous Contraption + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3536793764))); // Tal'darim Probe + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2647152737))); // Ten Pounder + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2768450096))); // That Which Must Not be Named + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)291388179))); // The Black Dog + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3475456761))); // The Bumble + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)95923716))); // The Stomach + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)291388176))); // Tiger Hound + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)471039390))); // Unihorn + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2767458422))); // Xiansai Bear + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3620943088))); // Zayl's Loss + //Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3372877841))); // Knights of Westmarch + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1464422747))); // Blade Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)567892925))); // Anguish's Grasp + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2222542490))); // Auriel's Favor + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)702834904))); // Blue Horror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)702834901))); // Brimstone Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890384))); // Cosmic Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)702834903))); // Dark Bat + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1464422100))); // Demon Soaring + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)702834905))); // Dread + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2653514096))); // Echoes of the Mask + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)208405024))); // Eldritch Embrace + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3890992984))); // Embrace of the Pure One + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1464439640))); // Eternal Flame + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1081301157))); // Eternal Light + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1081297790))); // Falcon's Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)550271606))); // Fiacla-Géar + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)262300867))); // Fingers of Flame + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2479192435))); // Fingers of Terror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)546207131))); // Galactic + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)211305012))); // Harbinger of Destruction + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890379))); // Lady Gaki's Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3273442495))); // Lilith's Embrace + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890378))); // Lord Culsu's Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1335990173))); // Mercy's Gaze + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)702834906))); // Osseous Grasp + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)208454467))); // Pieces of Hatred + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2552747379))); // Prime Evil Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2764892181))); // Skeletal Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2029657407))); // Star Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)702834902))); // Sulfuric Tide + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2840660586))); // The Light of Heaven + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3297867693))); // The Mimic + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2222725144))); // The Pillars of Heaven + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)721772994))); // Trag'Oul Wings + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890383))); // Winds of Aldinach + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890380))); // Wings of Kokabiel + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890381))); // Wings of Lempo + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2036418836))); // Wings of Mastery + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)550271607))); // Wings of Northern Skies + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1905890382))); // Wings of Semyaz + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1185806158))); // Wings of Terror + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2590476058))); // Wings of the Betrayer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)726768249))); // Wings of the Crypt Guardian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)671128753))); // Wings of the Dedicated + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)4188235898))); // Wings of the Ghost Queen + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1030142027))); // Wings of Valor + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2015178386))); // Heaven's Might //1514497706 //Flags - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1428615110))); // Barbarian - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)895083523))); // Barbarian Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3194995136))); // BlizzCon 2015 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3484863475))); // Blood Master - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)522011784))); // Crusader - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)938178597))); // Crusader Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)566077307))); // Demon Hunter - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)28429688))); // Demon Hunter Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)177825848))); // Diablo - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)177825849))); // Diablo II - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)177825850))); // Diablo III - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2113242414))); // Dog - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)218434287))); // Dragon - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)590649887))); // Goat - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)4211285172))); // Harvest - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)127020830))); // Heroes of the Storm - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2644729685))); // Horse - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)177825852))); // Lord of Destruction - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1156357301))); // Loremaster - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3269693700))); // Monk - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)895493953))); // Monk Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1375359175))); // Monkey - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3829241798))); // Necromancer - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)671111717))); // Necromancer Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1769352763))); // Ox - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2575751604))); // Pig - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)4233838312))); // Rabbit - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2645002203))); // Rat - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)177825851))); // Reaper of Souls - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)455845058))); // Rooster - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3124785508))); // Samhain - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2732665546))); // Season 3 - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1329910150))); // Snake - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3359438927))); // Tiger - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2885511819))); // Tyrael's Justice - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)3532272868))); // Warsong Pennant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)2626988266))); // Witch Doctor - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)28430311))); // Witch Doctor Ascendant - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)1114884937))); // Wizard - C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder().SetGbid(unchecked((int)938200550))); // Wizard Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1428615110))); // Barbarian + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)895083523))); // Barbarian Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3194995136))); // BlizzCon 2015 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3484863475))); // Blood Master + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)522011784))); // Crusader + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)938178597))); // Crusader Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)566077307))); // Demon Hunter + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)28429688))); // Demon Hunter Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)177825848))); // Diablo + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)177825849))); // Diablo II + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)177825850))); // Diablo III + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2113242414))); // Dog + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)218434287))); // Dragon + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)590649887))); // Goat + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)4211285172))); // Harvest + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)127020830))); // Heroes of the Storm + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2644729685))); // Horse + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)177825852))); // Lord of Destruction + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1156357301))); // Loremaster + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3269693700))); // Monk + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)895493953))); // Monk Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1375359175))); // Monkey + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3829241798))); // Necromancer + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)671111717))); // Necromancer Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1769352763))); // Ox + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2575751604))); // Pig + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)4233838312))); // Rabbit + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2645002203))); // Rat + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)177825851))); // Reaper of Souls + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)455845058))); // Rooster + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3124785508))); // Samhain + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2732665546))); // Season 3 + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1329910150))); // Snake + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3359438927))); // Tiger + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2885511819))); // Tyrael's Justice + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)3532272868))); // Warsong Pennant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)2626988266))); // Witch Doctor + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)28430311))); // Witch Doctor Ascendant + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)1114884937))); // Wizard + C.AddCosmeticItems_(D3.CosmeticItems.CosmeticItem.CreateBuilder() + .SetGbid(unchecked((int)938200550))); // Wizard Ascendant //*/ - #endregion + + #endregion + return C.Build().ToByteString(); } @@ -1637,28 +2166,29 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var test1 = D3.Store.GetPaymentMethods.ParseFrom(data); var testresp2 = D3.Store.GetPaymentMethodsResponse.CreateBuilder() - .AddWallets(D3.Store.Wallet.CreateBuilder().SetPrimary(true).SetWalletId(840).SetWalletName("US Dollar").SetFixedPointBalance(50)) + .AddWallets(D3.Store.Wallet.CreateBuilder().SetPrimary(true).SetWalletId(840) + .SetWalletName("US Dollar").SetFixedPointBalance(50)) //.AddWallets(D3.Store.Wallet.CreateBuilder().SetPrimary(true).SetWalletId(826).SetWalletName("Pound Streling").SetFixedPointBalance(50)) ; - /* - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("GBP").SetId(826).SetSymbol("GBP").SetName("Pound Sterling")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("NZD").SetId(554).SetSymbol("NZD").SetName("New Zealand Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CLP").SetId(152).SetSymbol("CLP").SetName("Chilean Peso")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("TPT").SetId(16).SetSymbol("NT$").SetName("TPT")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD").SetName("Canadian Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("KRW").SetId(410).SetSymbol("KRW").SetName("Won")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("USD").SetId(840).SetSymbol("USD").SetName("US Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("JPY").SetId(392).SetSymbol("JPY").SetName("Yen")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("MXN").SetId(484).SetSymbol("MXN").SetName("Mexican Peso")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("BRL").SetId(986).SetSymbol("BRL").SetName("Brazilian Real")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("AUD").SetId(36).SetSymbol("AUD").SetName("Australian Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD").SetName("Canadian Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("EUR").SetId(978).SetSymbol("EUR").SetName("Euro")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("ARS").SetId(32).SetSymbol("ARS").SetName("Argentine Peso")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("RUB").SetId(643).SetSymbol("RUB").SetName("Russian Ruble")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CPT").SetId(15).SetSymbol("¥").SetName("CPT")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("XDC").SetId(26).SetSymbol("$").SetName("D3 Platinum")) - //*/ + /* + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("GBP").SetId(826).SetSymbol("GBP").SetName("Pound Sterling")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("NZD").SetId(554).SetSymbol("NZD").SetName("New Zealand Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CLP").SetId(152).SetSymbol("CLP").SetName("Chilean Peso")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("TPT").SetId(16).SetSymbol("NT$").SetName("TPT")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD").SetName("Canadian Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("KRW").SetId(410).SetSymbol("KRW").SetName("Won")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("USD").SetId(840).SetSymbol("USD").SetName("US Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("JPY").SetId(392).SetSymbol("JPY").SetName("Yen")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("MXN").SetId(484).SetSymbol("MXN").SetName("Mexican Peso")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("BRL").SetId(986).SetSymbol("BRL").SetName("Brazilian Real")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("AUD").SetId(36).SetSymbol("AUD").SetName("Australian Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD").SetName("Canadian Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("EUR").SetId(978).SetSymbol("EUR").SetName("Euro")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("ARS").SetId(32).SetSymbol("ARS").SetName("Argentine Peso")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("RUB").SetId(643).SetSymbol("RUB").SetName("Russian Ruble")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CPT").SetId(15).SetSymbol("¥").SetName("CPT")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("XDC").SetId(26).SetSymbol("$").SetName("D3 Platinum")) + //*/ return testresp2.Build().ToByteString(); } @@ -1671,12 +2201,13 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return testresp.Build().ToByteString(); } + private ByteString CurrentStore(BattleClient client, ByteString data) { - var test = D3.Store.GetProductCategories.ParseFrom(data); var responseCategoriese = D3.Store.GetProductCategoriesResponse.CreateBuilder(); - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(0).SetNewestProductTime(0x6E1199DE92C0000)); //Popular + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(0) + .SetNewestProductTime(0x6E1199DE92C0000)); //Popular //responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(1).SetNewestProductTime(0)); //Platinum //responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(2).SetNewestProductTime(0)); //? //responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(3).SetNewestProductTime(0)); //Addition @@ -1686,16 +2217,24 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services //responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(7).SetNewestProductTime(0)); //Elite kits //responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(8).SetNewestProductTime(0)); //Crusader //responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(9).SetNewestProductTime(0)); //Adventurer's Pass - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(10).SetNewestProductTime(0x72A0D8B7AD90000));//Wings - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(11).SetNewestProductTime(0x725C16B88870000));//Pets - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(12).SetNewestProductTime(0));//Framework - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(13).SetNewestProductTime(0));//Flags - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(14).SetNewestProductTime(0));//Strengthening the Hero - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(15).SetNewestProductTime(0));//Hero Cells - responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(16).SetNewestProductTime(0));//Stash Tabs + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(10) + .SetNewestProductTime(0x72A0D8B7AD90000)); //Wings + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(11) + .SetNewestProductTime(0x725C16B88870000)); //Pets + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(12) + .SetNewestProductTime(0)); //Framework + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(13) + .SetNewestProductTime(0)); //Flags + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(14) + .SetNewestProductTime(0)); //Strengthening the Hero + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(15) + .SetNewestProductTime(0)); //Hero Cells + responseCategoriese.AddCategories(D3.Store.ProductCategory.CreateBuilder().SetCategory(16) + .SetNewestProductTime(0)); //Stash Tabs return responseCategoriese.Build().ToByteString(); } + private ByteString CurrentStore1(BattleClient client, ByteString data) { var request = D3.Store.GetProductList.ParseFrom(data); @@ -1703,435 +2242,686 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services if (request.Category == 0) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2036418836))) // Wings of Mastery - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(50000000).SetFixedPointRetailPrice(50000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(4)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3194995136))) // Blizzcon 2015 - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(1).SetBundleLabel("") - .SetProductId(130002)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1514497706))) // MalGanis - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(70000000).SetFixedPointRetailPrice(80000000)) //Value Type, Discount Price, Regular Price - .SetCategory(11).SetFeatured(2).SetBundleLabel("") - .SetProductId(11000)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2431587061))) // Angelic - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(2000000).SetFixedPointRetailPrice(5000000)) //Value Type, Discount Price, Regular Price - .SetCategory(12).SetFeatured(3).SetBundleLabel("") - .SetProductId(12000)) - ; + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)2036418836))) // Wings of Mastery + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(50000000) + .SetFixedPointRetailPrice(50000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(4)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)3194995136))) // Blizzcon 2015 + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(1).SetBundleLabel("") + .SetProductId(130002)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1514497706))) // MalGanis + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(70000000) + .SetFixedPointRetailPrice(80000000)) //Value Type, Discount Price, Regular Price + .SetCategory(11).SetFeatured(2).SetBundleLabel("") + .SetProductId(11000)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2431587061))) // Angelic + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(2000000) + .SetFixedPointRetailPrice(5000000)) //Value Type, Discount Price, Regular Price + .SetCategory(12).SetFeatured(3).SetBundleLabel("") + .SetProductId(12000)) + ; } + #region Platinum + if (request.Category == 1) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(500)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(50000).SetFixedPointRetailPrice(50000)) //Value Type, Discount Price, Regular Price - .SetCategory(1).SetFeatured(0).SetBundleLabel("") - .SetProductId(11383)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(1000)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(80000).SetFixedPointRetailPrice(80000)) //Value Type, Discount Price, Regular Price - .SetCategory(1).SetFeatured(1).SetBundleLabel("") - .SetProductId(11384)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(5000)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(299900).SetFixedPointRetailPrice(350000)) //Value Type, Discount Price, Regular Price - .SetCategory(1).SetFeatured(1).SetBundleLabel("") - .SetProductId(11385)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(10000)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(499900).SetFixedPointRetailPrice(499900)) //Value Type, Discount Price, Regular Price - .SetCategory(1).SetFeatured(1).SetBundleLabel("") - .SetProductId(11386)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(50000)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(0).SetFixedPointRetailPrice(990000)) //Value Type, Discount Price, Regular Price - .SetCategory(1).SetFeatured(1).SetBundleLabel("") - .SetProductId(11387)) - ; + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(500)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(50000) + .SetFixedPointRetailPrice(50000)) //Value Type, Discount Price, Regular Price + .SetCategory(1).SetFeatured(0).SetBundleLabel("") + .SetProductId(11383)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(1000)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(80000) + .SetFixedPointRetailPrice(80000)) //Value Type, Discount Price, Regular Price + .SetCategory(1).SetFeatured(1).SetBundleLabel("") + .SetProductId(11384)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(5000)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(299900) + .SetFixedPointRetailPrice(350000)) //Value Type, Discount Price, Regular Price + .SetCategory(1).SetFeatured(1).SetBundleLabel("") + .SetProductId(11385)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(10000)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(499900) + .SetFixedPointRetailPrice(499900)) //Value Type, Discount Price, Regular Price + .SetCategory(1).SetFeatured(1).SetBundleLabel("") + .SetProductId(11386)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(50000)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(15).SetFixedPointCost(0) + .SetFixedPointRetailPrice(990000)) //Value Type, Discount Price, Regular Price + .SetCategory(1).SetFeatured(1).SetBundleLabel("") + .SetProductId(11387)) + ; } + #endregion + #region Wings + if (request.Category == 10) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890383)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(1)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890380)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(2)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890381)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(3)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(2036418836)) // Wings of Mastery - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(50000000).SetFixedPointRetailPrice(50000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(4)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(550271607)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(5)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1185806158)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(1).SetFeatured(0).SetBundleLabel("") - .SetProductId(6)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2590476058))) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(7)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(671128753)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(8)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)4188235898))) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(9)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1030142027))) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(10)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(721772994)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(11)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(567892925)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(12)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1464422747)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(13)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890384)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(14)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1081297790)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(15)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890379)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(16)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890378)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(17)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2764892181))) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(18)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(2029657407)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(19)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(721772994)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(10).SetFeatured(0).SetBundleLabel("") - .SetProductId(20)); + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890383)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(1)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890380)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(2)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890381)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(3)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(2036418836)) // Wings of Mastery + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(50000000) + .SetFixedPointRetailPrice(50000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(4)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(550271607)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(5)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1185806158)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(1).SetFeatured(0).SetBundleLabel("") + .SetProductId(6)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2590476058))) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(7)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(671128753)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(8)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)4188235898))) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(9)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1030142027))) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(10)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(721772994)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(11)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(567892925)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(12)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1464422747)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(13)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890384)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(14)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1081297790)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(15)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890379)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(16)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1905890378)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(17)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2764892181))) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(18)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(2029657407)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(19)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(721772994)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(10).SetFeatured(0).SetBundleLabel("") + .SetProductId(20)); } #endregion + #region Pets + if (request.Category == 11) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1514497706))) // MalGanis - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(70000000).SetFixedPointRetailPrice(80000000)) //Value Type, Discount Price, Regular Price - .SetCategory(11).SetBundleLabel("") - .SetProductId(11000)); + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1514497706))) // MalGanis + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(70000000) + .SetFixedPointRetailPrice(80000000)) //Value Type, Discount Price, Regular Price + .SetCategory(11).SetBundleLabel("") + .SetProductId(11000)); } + #endregion + #region Framework + if (request.Category == 12) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2431587061))) // Angelic - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(2000000).SetFixedPointRetailPrice(5000000)) //Value Type, Discount Price, Regular Price - .SetCategory(12).SetBundleLabel("") - .SetProductId(12000)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)604200072))) // OverWatch - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(3000000).SetFixedPointRetailPrice(5000000)) //Value Type, Discount Price, Regular Price - .SetCategory(12).SetBundleLabel("") - .SetProductId(12001)) - ; - + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2431587061))) // Angelic + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(2000000) + .SetFixedPointRetailPrice(5000000)) //Value Type, Discount Price, Regular Price + .SetCategory(12).SetBundleLabel("") + .SetProductId(12000)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)604200072))) // OverWatch + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(3000000) + .SetFixedPointRetailPrice(5000000)) //Value Type, Discount Price, Regular Price + .SetCategory(12).SetBundleLabel("") + .SetProductId(12001)) + ; } + #endregion + #region Flags + if (request.Category == 13) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1428615110)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130000)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(895083523)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130001)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3194995136))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130002)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3484863475))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130003)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(522011784)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130004)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(938178597)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130005)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(566077307)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130006)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(28429688)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130007)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825848)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130008)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825849)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130009)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825850)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130010)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(2113242414)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130011)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(218434287)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130012)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(590649887)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130013)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(895083523)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130014)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)4211285172))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130015)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(127020830)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130016)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2644729685))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130017)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825852)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130018)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1156357301)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130019)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3269693700))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130020)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(895493953)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130021)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1375359175)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130022)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3269693700))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130023)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3829241798))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130024)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)671111717))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130025)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1769352763))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130026)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2575751604))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130027)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)4233838312))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130028)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2645002203))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130029)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)177825851))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130030)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)455845058))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130031)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3124785508))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130032)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2732665546))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130033)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1329910150))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130034)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3359438927))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130035)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2885511819))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130036)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3532272868))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130037)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2626988266))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130038)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)28430311))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130039)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1114884937))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130040)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)938200550))) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000).SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price - .SetCategory(13).SetFeatured(0).SetBundleLabel("") - .SetProductId(130041)) - - ; + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1428615110)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130000)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(895083523)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130001)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3194995136))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130002)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3484863475))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130003)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(522011784)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130004)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(938178597)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130005)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(566077307)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130006)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(28429688)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130007)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825848)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130008)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825849)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130009)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825850)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130010)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(2113242414)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130011)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(218434287)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130012)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(590649887)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130013)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(895083523)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130014)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)4211285172))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130015)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(127020830)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130016)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2644729685))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130017)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(177825852)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130018)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1156357301)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130019)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3269693700))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130020)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(895493953)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130021)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetGbid(1375359175)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130022)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3269693700))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130023)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3829241798))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130024)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)671111717))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130025)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1769352763))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130026)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2575751604))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130027)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)4233838312))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130028)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2645002203))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130029)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)177825851))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130030)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)455845058))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130031)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3124785508))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130032)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2732665546))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130033)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1329910150))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130034)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3359438927))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130035)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2885511819))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130036)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)3532272868))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130037)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)2626988266))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130038)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)28430311))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130039)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements( + D3.Store.ProductEntitlement.CreateBuilder().SetGbid(unchecked((int)1114884937))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130040)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder() + .SetGbid(unchecked((int)938200550))) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(15000000) + .SetFixedPointRetailPrice(15000000)) //Value Type, Discount Price, Regular Price + .SetCategory(13).SetFeatured(0).SetBundleLabel("") + .SetProductId(130041)) + ; } + #endregion + #region Boosts + if (request.Category == 14) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(16)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(60000000).SetFixedPointRetailPrice(60000000)) //Value Type, Discount Price, Regular Price - .SetCategory(14).SetDurationSecs(2592000) - .SetProductId(12101)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(16)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(0).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(14).SetDurationSecs(604800) - .SetProductId(12102)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(17)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(60000000).SetFixedPointRetailPrice(60000000)) //Value Type, Discount Price, Regular Price - .SetCategory(14).SetDurationSecs(2592000) - .SetProductId(12103)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(17)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(14).SetDurationSecs(604800) - .SetProductId(12104)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(18)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(60000000).SetFixedPointRetailPrice(60000000)) //Value Type, Discount Price, Regular Price - .SetCategory(14).SetDurationSecs(2592000) - .SetProductId(12105)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(18)) // - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(14).SetDurationSecs(604800) - .SetProductId(12106)) - ; + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(16)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(60000000) + .SetFixedPointRetailPrice(60000000)) //Value Type, Discount Price, Regular Price + .SetCategory(14).SetDurationSecs(2592000) + .SetProductId(12101)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(16)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(0) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(14).SetDurationSecs(604800) + .SetProductId(12102)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(17)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(60000000) + .SetFixedPointRetailPrice(60000000)) //Value Type, Discount Price, Regular Price + .SetCategory(14).SetDurationSecs(2592000) + .SetProductId(12103)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(17)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(14).SetDurationSecs(604800) + .SetProductId(12104)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(18)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(60000000) + .SetFixedPointRetailPrice(60000000)) //Value Type, Discount Price, Regular Price + .SetCategory(14).SetDurationSecs(2592000) + .SetProductId(12105)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(18)) // + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(14).SetDurationSecs(604800) + .SetProductId(12106)) + ; } + #endregion + #region Hero Cells + if (request.Category == 15) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(11).SetMaxStackCount(10)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(100000000).SetFixedPointRetailPrice(100000000)) //Value Type, Discount Price, Regular Price - .SetCategory(15) - .SetProductId(15000)) - ; + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(11) + .SetMaxStackCount(10)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(100000000) + .SetFixedPointRetailPrice(100000000)) //Value Type, Discount Price, Regular Price + .SetCategory(15) + .SetProductId(15000)) + ; } + #endregion + #region Stash Tabs + if (request.Category == 16) { store - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(14).SetMaxStackCount(5)).AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(0)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000).SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price - .SetCategory(16) - .AddMaxContentlicensesAllowed(D3.Store.ContentLicenseRestriction.CreateBuilder().SetContentLicenseId(14).SetCount(0)) - .SetProductId(160)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(14).SetMaxStackCount(5)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(40000000).SetFixedPointRetailPrice(40000000)) //Value Type, Discount Price, Regular Price - .SetCategory(16) - .AddMaxContentlicensesAllowed(D3.Store.ContentLicenseRestriction.CreateBuilder().SetContentLicenseId(14).SetCount(1)) - .AddMinContentlicensesRequired(D3.Store.ContentLicenseRestriction.CreateBuilder().SetContentLicenseId(14).SetCount(1)) - .SetProductId(161)) - .AddProducts(D3.Store.Product.CreateBuilder().AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(14).SetMaxStackCount(5)) - .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(80000000).SetFixedPointRetailPrice(80000000)) //Value Type, Discount Price, Regular Price - .SetCategory(16) - .AddMinContentlicensesRequired(D3.Store.ContentLicenseRestriction.CreateBuilder().SetContentLicenseId(14).SetCount(2)) - .SetProductId(162)) - - ; + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(14) + .SetMaxStackCount(5)) + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetPlatinumAmount(0)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(20000000) + .SetFixedPointRetailPrice(20000000)) //Value Type, Discount Price, Regular Price + .SetCategory(16) + .AddMaxContentlicensesAllowed(D3.Store.ContentLicenseRestriction.CreateBuilder() + .SetContentLicenseId(14).SetCount(0)) + .SetProductId(160)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(14) + .SetMaxStackCount(5)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(40000000) + .SetFixedPointRetailPrice(40000000)) //Value Type, Discount Price, Regular Price + .SetCategory(16) + .AddMaxContentlicensesAllowed(D3.Store.ContentLicenseRestriction.CreateBuilder() + .SetContentLicenseId(14).SetCount(1)) + .AddMinContentlicensesRequired(D3.Store.ContentLicenseRestriction.CreateBuilder() + .SetContentLicenseId(14).SetCount(1)) + .SetProductId(161)) + .AddProducts(D3.Store.Product.CreateBuilder() + .AddEntitlements(D3.Store.ProductEntitlement.CreateBuilder().SetContentLicenseId(14) + .SetMaxStackCount(5)) + .AddPrices(D3.Store.ProductPrice.CreateBuilder().SetCurrency(26).SetFixedPointCost(80000000) + .SetFixedPointRetailPrice(80000000)) //Value Type, Discount Price, Regular Price + .SetCategory(16) + .AddMinContentlicensesRequired(D3.Store.ContentLicenseRestriction.CreateBuilder() + .SetContentLicenseId(14).SetCount(2)) + .SetProductId(162)) + ; } + #endregion //Currencies store - - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("GBP").SetId(826).SetSymbol("GBP").SetName("Pound Sterling")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("NZD").SetId(554).SetSymbol("NZD").SetName("New Zealand Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CLP").SetId(152).SetSymbol("CLP").SetName("Chilean Peso")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("TPT").SetId(16).SetSymbol("NT$").SetName("TPT")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD").SetName("Canadian Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("KRW").SetId(410).SetSymbol("KRW").SetName("Won")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("USD").SetId(840).SetSymbol("USD").SetName("US Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("JPY").SetId(392).SetSymbol("JPY").SetName("Yen")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("MXN").SetId(484).SetSymbol("MXN").SetName("Mexican Peso")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("BRL").SetId(986).SetSymbol("BRL").SetName("Brazilian Real")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("AUD").SetId(36).SetSymbol("AUD").SetName("Australian Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD").SetName("Canadian Dollar")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("EUR").SetId(978).SetSymbol("EUR").SetName("Euro")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("ARS").SetId(32).SetSymbol("ARS").SetName("Argentine Peso")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("RUB").SetId(643).SetSymbol("RUB").SetName("Russian Ruble")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("GBP").SetId(826).SetSymbol("GBP") + .SetName("Pound Sterling")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("NZD").SetId(554).SetSymbol("NZD") + .SetName("New Zealand Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CLP").SetId(152).SetSymbol("CLP") + .SetName("Chilean Peso")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("TPT").SetId(16).SetSymbol("NT$") + .SetName("TPT")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD") + .SetName("Canadian Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("KRW").SetId(410).SetSymbol("KRW") + .SetName("Won")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("USD").SetId(840).SetSymbol("USD") + .SetName("US Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("JPY").SetId(392).SetSymbol("JPY") + .SetName("Yen")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("MXN").SetId(484).SetSymbol("MXN") + .SetName("Mexican Peso")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("BRL").SetId(986).SetSymbol("BRL") + .SetName("Brazilian Real")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("AUD").SetId(36).SetSymbol("AUD") + .SetName("Australian Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CAD").SetId(124).SetSymbol("CAD") + .SetName("Canadian Dollar")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("EUR").SetId(978).SetSymbol("EUR") + .SetName("Euro")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("ARS").SetId(32).SetSymbol("ARS") + .SetName("Argentine Peso")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("RUB").SetId(643).SetSymbol("RUB") + .SetName("Russian Ruble")) .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("CPT").SetId(15).SetSymbol("¥").SetName("CPT")) - .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("XDC").SetId(26).SetSymbol("$").SetName("D3 Platinum")) + .AddCurrencies(D3.Store.Currency.CreateBuilder().SetCode("XDC").SetId(26).SetSymbol("$") + .SetName("D3 Platinum")) ; return store.Build().ToByteString(); } + private ByteString SetCollection(BattleClient client, ByteString data) { - var request = D3.GameMessage.EquipCosmeticItem.ParseFrom(data); - - + var request = EquipCosmeticItem.ParseFrom(data); + + switch (request.CosmeticItemType) { case 1: @@ -2150,23 +2940,31 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var RangeCosmetic = new[] { - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic1).Build(), // Wings - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic2).Build(), // Flag - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic3).Build(), // Pet - D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic4).Build(), // Frame + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic1) + .Build(), // Wings + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic2) + .Build(), // Flag + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic3) + .Build(), // Pet + D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(client.Account.GameAccount.CurrentToon.Cosmetic4) + .Build(), // Frame }; client.Account.GameAccount.CurrentToon.StateChanged(); var NewVisual = D3.Hero.VisualEquipment.CreateBuilder() - .AddRangeVisualItem(client.Account.GameAccount.CurrentToon.HeroVisualEquipmentField.Value.VisualItemList).AddRangeCosmeticItem(RangeCosmetic).Build(); + .AddRangeVisualItem( + client.Account.GameAccount.CurrentToon.HeroVisualEquipmentField.Value.VisualItemList) + .AddRangeCosmeticItem(RangeCosmetic).Build(); client.Account.GameAccount.CurrentToon.HeroVisualEquipmentField.Value = NewVisual; - client.Account.GameAccount.ChangedFields.SetPresenceFieldValue(client.Account.GameAccount.CurrentToon.HeroVisualEquipmentField); + client.Account.GameAccount.ChangedFields.SetPresenceFieldValue(client.Account.GameAccount.CurrentToon + .HeroVisualEquipmentField); client.Account.GameAccount.NotifyUpdate(); return NewVisual.ToByteString(); } + private ByteString StoreRequest(BattleClient client, ByteString data) { var req = GetHeroIds.ParseFrom(data); @@ -2174,27 +2972,32 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var Status = CheatModifyStoreState.CreateBuilder().SetEnable(false); return Status.Build().ToByteString(); } + private ByteString TestRequest(BattleClient client, ByteString data) { var req = CSPullSnapshot.ParseFrom(data); var HeroDigestList = D3.Hero.DigestList.CreateBuilder(); foreach (Toon t in client.Account.GameAccount.Toons) HeroDigestList.AddDigests(t.Digest); - var Snap = D3.CS.HeroesList.CreateBuilder().SetCurrentSeasonNum(1).SetCurrentSeasonState(1).SetDigests(HeroDigestList); + var Snap = D3.CS.HeroesList.CreateBuilder().SetCurrentSeasonNum(1).SetCurrentSeasonState(1) + .SetDigests(HeroDigestList); return Snap.Build().ToByteString(); } + #endregion + #region Changing session parameters + private ByteString SwitchParameters(BattleClient client, ByteString data) { - - var request = D3.GameMessage.MatchmakingGetStats.ParseFrom(data); + var request = MatchmakingGetStats.ParseFrom(data); var back = GamesSystem.GameFactoryManager.GetStatsBucketWithFilter(request); var response = MatchmakingGetStatsResponse.CreateBuilder().AddStatsBucket(back); return response.Build().ToByteString(); } + #endregion private ByteString OnGetToonSettings(BattleClient client, ByteString data) @@ -2203,17 +3006,19 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services var response = D3.Client.ToonSettings.CreateBuilder(); return response.Build().ToByteString(); } + private ByteString CurrentToon(BattleClient client, ByteString data) { SelectHero req = SelectHero.ParseFrom(data); D3.Client.ToonSettings.Builder res = D3.Client.ToonSettings.CreateBuilder(); return req.ToByteString(); } + private ByteString GetHeroProfs(BattleClient client, ByteString data) { var testRequest = GetHeroProfiles.ParseFrom(data); - var profileList = D3.Profile.HeroProfileList.CreateBuilder(); + var profileList = HeroProfileList.CreateBuilder(); if (testRequest.HeroIdsCount > 0) { foreach (var hero in testRequest.HeroIdsList) @@ -2235,6 +3040,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return profileList.Build().ToByteString(); } + private ByteString GetDeadedHeroDigests(BattleClient client, ByteString data) { var HeroDigestList = D3.Hero.DigestList.CreateBuilder(); @@ -2244,8 +3050,10 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services if (t.Dead) HeroDigestList.AddDigests(t.Digest); } + return HeroDigestList.Build().ToByteString(); } + private ByteString GetDeadedHeroProfs(BattleClient client, ByteString data) { var testRequest = GetFallenHeros.ParseFrom(data); @@ -2271,16 +3079,17 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services foreach (var hero in heroList) { //if (hero.Hardcore == true) - // if (hero.Dead == true) - profileList.AddHeros(hero.Profile); + // if (hero.Dead == true) + profileList.AddHeros(hero.Profile); } } return profileList.Build().ToByteString(); } + private ByteString SelectToon(BattleClient Client, ByteString data) { - var request = D3.GameMessage.HeroDigestListRequest.ParseFrom(data); + var request = HeroDigestListRequest.ParseFrom(data); var builder = HeroDigestListResponse.CreateBuilder(); foreach (var toon in request.ToonIdList) builder.AddDigestList(ToonManager.GetToonByLowID(toon).Digest); @@ -2293,14 +3102,17 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services byte[] response270 = { 8, 137, 249, 159, 185, 12, 16, 136, 14 }; return ByteString.CopyFrom(response270); } + private ByteString GetAchievements(BattleClient client, ByteString data) { var HeroDigestList = D3.Hero.DigestList.CreateBuilder(); foreach (Toon t in client.Account.GameAccount.Toons) HeroDigestList.AddDigests(t.Digest); - var Snap = D3.CS.HeroesList.CreateBuilder().SetCurrentSeasonNum(1).SetCurrentSeasonState(1).SetDigests(HeroDigestList); + var Snap = D3.CS.HeroesList.CreateBuilder().SetCurrentSeasonNum(1).SetCurrentSeasonState(1) + .SetDigests(HeroDigestList); return Snap.Build().ToByteString(); } + private ByteString RebirthMethod(BattleClient client, ByteString data) { RebirthHeroRequest Request = RebirthHeroRequest.ParseFrom(data); @@ -2317,6 +3129,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services return Response.Build().ToByteString(); } + private ByteString GetChallengeRift(BattleClient client, ByteString data) { var request = ChallengeRiftFetchHeroData.ParseFrom(data); @@ -2345,7 +3158,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .AddCosmeticItem(D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(-83682124)) .AddCosmeticItem(D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(-1200439285)) .AddCosmeticItem(D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(949147389)) - ) + ) .SetLastPlayedAct(0) .SetHighestUnlockedAct(3000) .SetLastPlayedQuest(87700) @@ -2371,7 +3184,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .SetUsedSocketCount(1) .SetGenerator(D3.Items.Generator.CreateBuilder() .SetSeed(3437070505) - .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGameBalanceType(2).SetGbid(1104405863)) + .SetGbHandle( + D3.GameBalance.Handle.CreateBuilder().SetGameBalanceType(2).SetGbid(1104405863)) .AddBaseAffixes(-1392021261) .AddBaseAffixes(1342579558) .AddBaseAffixes(-889190757) @@ -2388,20 +3202,20 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .SetId(ItemId.CreateBuilder().SetIdHigh(0).SetIdLow(4323455643408519424)) .SetGenerator(D3.Items.Generator.CreateBuilder() .SetSeed(2696508178) - .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGameBalanceType(2).SetGbid(-1038303580)) + .SetGbHandle(D3.GameBalance.Handle.CreateBuilder().SetGameBalanceType(2) + .SetGbid(-1038303580)) .SetFlags(436491) .SetDurability(0) .SetStackSize(1) .SetItemBindingLevel(2) .SetSeasonCreated(20) - ) ) + ) .SetLegendaryItemLevel(70) .SetSeasonCreated(20) .SetLegendaryBaseItemGbid(620036249) - ) + ) ) - ) .SetSnoActiveSkills(SkillsWithRunes.CreateBuilder() .AddRunes(SkillWithRune.CreateBuilder().SetSkill(108506).SetRuneType(4)) @@ -2410,21 +3224,22 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services .AddRunes(SkillWithRune.CreateBuilder().SetSkill(106237).SetRuneType(0)) .AddRunes(SkillWithRune.CreateBuilder().SetSkill(117402).SetRuneType(4)) .AddRunes(SkillWithRune.CreateBuilder().SetSkill(67616).SetRuneType(1)) - ) + ) .SetSnoTraits(PassiveSkills.CreateBuilder() .AddSnoTraits(208628) .AddSnoTraits(208639) .AddSnoTraits(208594) .AddSnoTraits(218191) - ) + ) .SetLegendaryPowers(LegendaryPowers.CreateBuilder() .AddGbidLegendaryPowers(1889450717) .AddGbidLegendaryPowers(-2073208480) .AddGbidLegendaryPowers(1160204002) - ) - ); + ) + ); + + #region Etalon - #region Etalon /* alt_level: 446 hero_digest { @@ -3738,22 +4553,26 @@ target_millisecond: 362116 challenge_end_time_unix_seconds: 1583200800 */ + #endregion return response.Build().ToByteString(); } + private ByteString ClearMissions(BattleClient client, ByteString data) { var request = ResetHeroStoryProgress.ParseFrom(data); return request.ToByteString(); } + private static byte[] StringToByteArray(string hex) { return Enumerable.Range(0, hex.Length) - .Where(x => x % 2 == 0) - .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) - .ToArray(); + .Where(x => x % 2 == 0) + .Select(x => Convert.ToByte(hex.Substring(x, 2), 16)) + .ToArray(); } + private ByteString GetGameAccountSettings(BattleClient client) { Logger.Debug("GetGameAccountSettings()"); @@ -3761,6 +4580,7 @@ challenge_end_time_unix_seconds: 1583200800 var gameAccount = client.Account.GameAccount; return gameAccount.Settings.ToByteString(); } + private ByteString SetGameAccountSettings(SetGameAccountSettings settings, BattleClient client) { Logger.Debug("SetGameAccountSettings()"); @@ -3768,10 +4588,12 @@ challenge_end_time_unix_seconds: 1583200800 client.Account.GameAccount.Settings = settings.Settings; return ByteString.Empty; } + private static BNetPacket GetPacketFromHexByteArray(byte[] bytemessage) { DotNetty.Buffers.IByteBuffer BB = DotNetty.Buffers.Unpooled.WrappedBuffer(bytemessage); - DotNetty.Codecs.Http.WebSockets.BinaryWebSocketFrame msg = new DotNetty.Codecs.Http.WebSockets.BinaryWebSocketFrame(BB); + DotNetty.Codecs.Http.WebSockets.BinaryWebSocketFrame msg = + new DotNetty.Codecs.Http.WebSockets.BinaryWebSocketFrame(BB); if (msg.Content.ReadableBytes < 2) { return null; @@ -3782,6 +4604,7 @@ challenge_end_time_unix_seconds: 1583200800 { return null; } + byte[] headerBuf = new byte[headerSize]; msg.Content.ReadBytes(headerBuf); Header header = Header.ParseFrom(headerBuf); @@ -3791,14 +4614,15 @@ challenge_end_time_unix_seconds: 1583200800 { return null; } + byte[] payload = new byte[payloadSize]; msg.Content.ReadBytes(payload); return new BNetPacket(header, payload); } + private ByteString OnGetAccountPrefs(BattleClient client, ByteString data) => ByteString.Empty; #endregion - } -} +} \ No newline at end of file diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/NotificationService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/NotificationService.cs index 70b8e0f..d846cc9 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/NotificationService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/NotificationService.cs @@ -37,7 +37,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services CommandManager.TryParse(request.AttributeList[0].Value.StringValue, (controller as HandlerController).Client); // try parsing it as a command and respond it if so. else { - var notification = bgs.protocol.notification.v1.Notification.CreateBuilder(request) + var notification = Notification.CreateBuilder(request) .SetSenderId((controller as HandlerController).Client.Account.GameAccount.BnetEntityId) .SetSenderAccountId((controller as HandlerController).Client.Account.BnetEntityId) .Build(); @@ -51,20 +51,20 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services break; } //*/ - var builder = bgs.protocol.NoData.CreateBuilder(); + var builder = NoData.CreateBuilder(); done(builder.Build()); } public override void Subscribe(IRpcController controller, SubscribeRequest request, Action done) { //throw new NotImplementedException(); - var builder = bgs.protocol.NoData.CreateBuilder(); + var builder = NoData.CreateBuilder(); done(builder.Build()); } public override void Unsubscribe(IRpcController controller, UnsubscribeRequest request, Action done) { - var builder = bgs.protocol.NoData.CreateBuilder(); + var builder = NoData.CreateBuilder(); done(builder.Build()); //throw new NotImplementedException(); } diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/PresenceService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/PresenceService.cs index b867ff6..0c97f25 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/PresenceService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/PresenceService.cs @@ -74,7 +74,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public override void Query(IRpcController controller, QueryRequest request, Action done) { - var builder = bgs.protocol.presence.v1.QueryResponse.CreateBuilder(); + var builder = QueryResponse.CreateBuilder(); switch (request.EntityId.GetHighIdType()) { @@ -113,7 +113,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services done(builder.Build()); } - public override void Subscribe(IRpcController controller, bgs.protocol.presence.v1.SubscribeRequest request, Action done) + public override void Subscribe(IRpcController controller, SubscribeRequest request, Action done) { Task.Run(() => { @@ -145,12 +145,12 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services } }); - var builder = bgs.protocol.NoData.CreateBuilder(); + var builder = NoData.CreateBuilder(); done(builder.Build()); } - public override void Unsubscribe(IRpcController controller, bgs.protocol.presence.v1.UnsubscribeRequest request, Action done) + public override void Unsubscribe(IRpcController controller, UnsubscribeRequest request, Action done) { switch (request.EntityId.GetHighIdType()) { @@ -181,7 +181,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services break; } - var builder = bgs.protocol.NoData.CreateBuilder(); + var builder = NoData.CreateBuilder(); done(builder.Build()); } @@ -229,7 +229,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services break; } - var builder = bgs.protocol.NoData.CreateBuilder(); + var builder = NoData.CreateBuilder(); done(builder.Build()); } diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ResourceService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ResourceService.cs index d27438e..b2ab2b6 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ResourceService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/ResourceService.cs @@ -11,7 +11,7 @@ using Google.ProtocolBuffers; namespace DiIiS_NA.LoginServer.ServicesSystem.Services { [Service(serviceID: 0x3d, serviceName: "bnet.protocol.resources.Resources")] - public class ResourceService : bgs.protocol.resources.v1.ResourcesService, IServerService + public class ResourceService : ResourcesService, IServerService { private static readonly Logger Logger = LogManager.CreateLogger(); private static byte[] PFTY_HASH = new byte[] { (byte)0xCF, (byte)0x61, (byte)0xE0, (byte)0x81, (byte)0x09, (byte)0x19, (byte)0xC6, (byte)0xA6, (byte)0xF9, (byte)0xC1, (byte)0xCB, (byte)0x24, (byte)0xB3, (byte)0xC6, (byte)0x9D, (byte)0x03, (byte)0xB0, (byte)0x37, (byte)0x08, (byte)0xEC, (byte)0x16, (byte)0xD9, (byte)0x44, (byte)0x51, (byte)0xC5, (byte)0x1F, (byte)0x90, (byte)0x38, (byte)0xE9, (byte)0x09, (byte)0xA7, (byte)0x5A }; diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/SessionService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/SessionService.cs index e30c638..3556e71 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/SessionService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/SessionService.cs @@ -3,6 +3,7 @@ using System; using bgs.protocol; using bgs.protocol.session.v1; using DiIiS_NA.Core.Helpers.Math; +using DiIiS_NA.Core.Logging; using DiIiS_NA.LoginServer.Base; using Google.ProtocolBuffers; @@ -11,12 +12,13 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services [Service(serviceID: 0x13, serviceName: "bnet.protocol.session.SessionService")] public class SessionService : bgs.protocol.session.v1.SessionService, IServerService { + private static readonly Logger Logger = LogManager.CreateLogger(nameof(SessionService)); public override void CreateSession(IRpcController controller, CreateSessionRequest request, Action done) { string Start = "A7B5C8B0593FFEC10000000"; string End = "BCABD"; - string session = Start + RandomHelper.Next(0, 9).ToString() + RandomHelper.Next(0, 9).ToString() + RandomHelper.Next(0, 9).ToString() + RandomHelper.Next(0, 9).ToString() + End; + string session = Start + RandomHelper.Next(0, 9) + RandomHelper.Next(0, 9) + RandomHelper.Next(0, 9) + RandomHelper.Next(0, 9) + End; CreateSessionResponse.Builder builder = CreateSessionResponse.CreateBuilder(); builder.SetSessionId(session); done(builder.Build()); @@ -25,23 +27,24 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services n.SetIdentity(request.Identity) .SetReason(0) .SetSessionId(session); - (controller as HandlerController).Client.MakeRPC((lid) => SessionListener.CreateStub((controller as HandlerController).Client).OnSessionCreated(controller, n.Build(), callback => { })); + ((HandlerController) controller).Client.MakeRPC((lid) => SessionListener.CreateStub(((HandlerController) controller).Client).OnSessionCreated(controller, n.Build(), callback => { })); } private void DisconnectClient(HandlerController controller) { - if (controller.Client.Account != null && controller.Client.Account.GameAccount != null) controller.Client.Account.GameAccount.LoggedInClient = null; - LoginServer.Battle.PlayerManager.PlayerDisconnected(controller.Client); + if (controller.Client.Account is { GameAccount: { } }) controller.Client.Account.GameAccount.LoggedInClient = null; + Battle.PlayerManager.PlayerDisconnected(controller.Client); } public override void DestroySession(IRpcController controller, DestroySessionRequest request, Action done) { - Console.WriteLine("Клиент - {0} , отключен", (controller as HandlerController).Client.SocketConnection.RemoteAddress); - this.DisconnectClient(controller as HandlerController); - if ((controller as HandlerController).Client.Account != null) - (controller as HandlerController).Client.Account.GameAccount.Logined = false; - ((controller as HandlerController).Client).Connect.CloseAsync(); - (controller as HandlerController).Client.SocketConnection.CloseAsync(); + Logger.MethodTrace(nameof(SessionService)); + Logger.Trace("Destroying game session for client {0}", ((HandlerController) controller).Client); + DisconnectClient((HandlerController) controller); + if (((HandlerController) controller).Client.Account != null) + ((HandlerController) controller).Client.Account.GameAccount.IsLoggedIn = false; + (((HandlerController) controller).Client).Connect.CloseAsync(); + ((HandlerController) controller).Client.SocketConnection.CloseAsync(); done(NoData.CreateBuilder().Build()); } @@ -57,10 +60,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services throw new NotImplementedException(); } - public override void GetSignedSessionState(IRpcController controller, GetSignedSessionStateRequest request, Action done) - { - done(GetSignedSessionStateResponse.CreateBuilder().SetToken("eyJ0eXAiOiJKV1QiLCJlbnYiOiJwcm9kLmV1IiwiYWxnIjoiUlMyNTYiLCJraWQiOiJmMDE5NzgzMi0zMWMwLTQzN2MtOTc2NC1iMzliOTM5MDJlNWMiLCJrdHkiOiJSU0EifQ").Build()); - } + public override void GetSignedSessionState(IRpcController controller, GetSignedSessionStateRequest request, Action done) + => done(GetSignedSessionStateResponse.CreateBuilder().SetToken("eyJ0eXAiOiJKV1QiLCJlbnYiOiJwcm9kLmV1IiwiYWxnIjoiUlMyNTYiLCJraWQiOiJmMDE5NzgzMi0zMWMwLTQzN2MtOTc2NC1iMzliOTM5MDJlNWMiLCJrdHkiOiJSU0EifQ").Build()); public override void MarkSessionsAlive(IRpcController controller, MarkSessionsAliveRequest request, Action done) { diff --git a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/UserManagerService.cs b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/UserManagerService.cs index 0ecda80..14f6c80 100644 --- a/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/UserManagerService.cs +++ b/src/DiIiS-NA/BGS-Server/ServicesSystem/Services/UserManagerService.cs @@ -16,9 +16,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services { private static readonly Logger Logger = LogManager.CreateLogger(); - public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, SubscribeRequest request, System.Action done) + public override void Subscribe(IRpcController controller, SubscribeRequest request, Action done) { - Logger.Trace("Subscribe() {0}", ((controller as HandlerController).Client)); + Logger.MethodTrace("Subscribe({0})", ((controller as HandlerController).Client)); UserManager.Instance.AddSubscriber(((controller as HandlerController).Client), request.ObjectId); @@ -41,7 +41,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public override void AddRecentPlayers(IRpcController controller, AddRecentPlayersRequest request, Action done) { - Logger.Trace("AddRecentPlayers()"); + Logger.MethodTrace("AddRecentPlayers()"); done(NoData.DefaultInstance); } @@ -52,7 +52,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public override void BlockPlayer(IRpcController controller, BlockPlayerRequest request, Action done) { - Logger.Trace("BlockEntity()"); + Logger.MethodTrace("BlockEntity()"); done(NoData.CreateBuilder().Build()); UserManager.BlockAccount(((controller as HandlerController).Client), request); @@ -60,7 +60,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services public override void UnblockPlayer(IRpcController controller, UnblockPlayerRequest request, Action done) { - Logger.Trace("UnblockPlayer()"); + Logger.MethodTrace("UnblockPlayer()"); done(NoData.CreateBuilder().Build()); UserManager.UnblockAccount(((controller as HandlerController).Client), request); diff --git a/src/DiIiS-NA/BGS-Server/Toons/Toon.cs b/src/DiIiS-NA/BGS-Server/Toons/Toon.cs index 2329353..d9dcc1c 100644 --- a/src/DiIiS-NA/BGS-Server/Toons/Toon.cs +++ b/src/DiIiS-NA/BGS-Server/Toons/Toon.cs @@ -15,10 +15,14 @@ namespace DiIiS_NA.LoginServer.Toons public class Toon : PersistentRPCObject { #region Cosmetics - public int Cosmetic1 { get { return this.DBToon.Cosmetic1; } set { lock (this.DBToon) { var dbToon = this.DBToon; dbToon.Cosmetic1 = value; DBSessions.SessionUpdate(dbToon); } } } - public int Cosmetic2 { get { return this.DBToon.Cosmetic2; } set { lock (this.DBToon) { var dbToon = this.DBToon; dbToon.Cosmetic2 = value; DBSessions.SessionUpdate(dbToon); } } } - public int Cosmetic3 { get { return this.DBToon.Cosmetic3; } set { lock (this.DBToon) { var dbToon = this.DBToon; dbToon.Cosmetic3 = value; DBSessions.SessionUpdate(dbToon); } } } - public int Cosmetic4 { get { return this.DBToon.Cosmetic4; } set { lock (this.DBToon) { var dbToon = this.DBToon; dbToon.Cosmetic4 = value; DBSessions.SessionUpdate(dbToon); } } } + public int Cosmetic1 { get => DBToon.Cosmetic1; + set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic1 = value; DBSessions.SessionUpdate(dbToon); } } } + public int Cosmetic2 { get => DBToon.Cosmetic2; + set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic2 = value; DBSessions.SessionUpdate(dbToon); } } } + public int Cosmetic3 { get => DBToon.Cosmetic3; + set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic3 = value; DBSessions.SessionUpdate(dbToon); } } } + public int Cosmetic4 { get => DBToon.Cosmetic4; + set { lock (DBToon) { var dbToon = DBToon; dbToon.Cosmetic4 = value; DBSessions.SessionUpdate(dbToon); } } } #endregion public DBToon DBToon @@ -47,7 +51,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - return DBSessions.SessionQuerySingle(s => s.DBToon.Id == this.PersistentID); + return DBSessions.SessionQuerySingle(s => s.DBToon.Id == PersistentID); } set { } } @@ -56,7 +60,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 1, 0, this.ClassID); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 1, 0, ClassID); return val; } } @@ -65,7 +69,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 2, 0, this.Level); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 2, 0, Level); return val; } } @@ -74,8 +78,8 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var tFlags = this.Flags; - if (this.IsHardcore) tFlags |= ToonFlags.Hardcore; + var tFlags = Flags; + if (IsHardcore) tFlags |= ToonFlags.Hardcore; var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 4, 0, (int)tFlags); return val; } @@ -87,13 +91,12 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 8, 0, this.ParagonLevel); + var val = new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 8, 0, ParagonLevel); return val; } } - public StringPresenceField HeroNameField - { get { return new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 5, 0, this._heroName); } } + public StringPresenceField HeroNameField => new StringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 5, 0, _heroName); private D3.Hero.VisualEquipment _visualEquipment = null; public bool _visualEquipmentChanged = true; @@ -102,7 +105,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - if (this._visualEquipmentChanged) + if (_visualEquipmentChanged) { var visualItems = new[] { @@ -122,7 +125,7 @@ namespace DiIiS_NA.LoginServer.Toons D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic3).Build(), // Pet D3.Hero.VisualCosmeticItem.CreateBuilder().SetGbid(Cosmetic4).Build(), // Frame }; - var visibleEquipment = DBSessions.SessionQueryWhere(inv => inv.DBToon.Id == this.PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 && inv.ForSale == false); + var visibleEquipment = DBSessions.SessionQueryWhere(inv => inv.DBToon.Id == PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 && inv.ForSale == false); foreach (var inv in visibleEquipment) { @@ -138,15 +141,14 @@ namespace DiIiS_NA.LoginServer.Toons .Build(); } - this._visualEquipment = D3.Hero.VisualEquipment.CreateBuilder().AddRangeVisualItem(visualItems).AddRangeCosmeticItem(CosmeticItems).Build(); - this._visualEquipmentChanged = false; + _visualEquipment = D3.Hero.VisualEquipment.CreateBuilder().AddRangeVisualItem(visualItems).AddRangeCosmeticItem(CosmeticItems).Build(); + _visualEquipmentChanged = false; } return new ByteStringPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 3, 0, _visualEquipment); } } - public IntPresenceField HighestUnlockedDifficulty - { get { return new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 7, 0, 9); } } + public IntPresenceField HighestUnlockedDifficulty => new IntPresenceField(FieldKeyHelper.Program.D3, FieldKeyHelper.OriginatingClass.Hero, 7, 0, 9); /// /// D3 EntityID encoded id. @@ -158,19 +160,19 @@ namespace DiIiS_NA.LoginServer.Toons /// public bool Deleted { - get { return this.DBToon.Deleted; } + get => DBToon.Deleted; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Deleted = value; DBSessions.SessionUpdate(dbToon); } } } - public bool isSeassoned + public bool IsSeasoned { get; set; @@ -178,12 +180,12 @@ namespace DiIiS_NA.LoginServer.Toons public int SeasonCreated { - get { return this.DBToon.CreatedSeason; } + get => DBToon.CreatedSeason; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.CreatedSeason = value; DBSessions.SessionUpdate(dbToon); } @@ -192,12 +194,12 @@ namespace DiIiS_NA.LoginServer.Toons public bool StoneOfPortal { - get { return this.DBToon.StoneOfPortal; } + get => DBToon.StoneOfPortal; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.StoneOfPortal = value; DBSessions.SessionUpdate(dbToon); } @@ -206,12 +208,12 @@ namespace DiIiS_NA.LoginServer.Toons public bool Dead { - get { return this.DBToon.Dead; } + get => DBToon.Dead; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Dead = value; DBSessions.SessionUpdate(dbToon); } @@ -223,12 +225,12 @@ namespace DiIiS_NA.LoginServer.Toons /// public bool Archieved { - get { return this.DBToon.Archieved; } + get => DBToon.Archieved; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Archieved = value; DBSessions.SessionUpdate(dbToon); } @@ -239,8 +241,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var _editions = DBSessions.SessionQueryWhere(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == this.PersistentID); - return _editions.Count() > 0; + return DBSessions.SessionQueryWhere(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == PersistentID).Any(); } set { } @@ -256,22 +257,20 @@ namespace DiIiS_NA.LoginServer.Toons /// public string Name { - get - { + get => //return this.IsHardcore ? string.Format("{{c_green}}{0}{{/c}}", this._heroName) : this._heroName; - return this._heroName;//this.IsHardcore ? this.isSeassoned ? string.Format("{{c_yellow}}{0}{{/c}}", this._heroName) : string.Format("{{c_red}}{0}{{/c}}", this._heroName) : this.isSeassoned ? string.Format("{{c_green}}{0}{{/c}}", this._heroName) : this._heroName; - } + _heroName; //this.IsHardcore ? this.isSeassoned ? string.Format("{{c_yellow}}{0}{{/c}}", this._heroName) : string.Format("{{c_red}}{0}{{/c}}", this._heroName) : this.isSeassoned ? string.Format("{{c_green}}{0}{{/c}}", this._heroName) : this._heroName; set { - this._heroName = value; - lock (this.DBToon) + _heroName = value; + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Name = value; DBSessions.SessionUpdate(dbToon); } - this.HeroNameField.Value = value; + HeroNameField.Value = value; } } @@ -291,16 +290,13 @@ namespace DiIiS_NA.LoginServer.Toons /// public GameAccount GameAccount { - get - { - return GameAccountManager.GetAccountByPersistentID(this.GameAccountId); - } + get => GameAccountManager.GetAccountByPersistentID(GameAccountId); set { - this.GameAccountId = value.PersistentID; - lock (this.DBToon) + GameAccountId = value.PersistentID; + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.DBGameAccount = value.DBGameAccount; DBSessions.SessionUpdate(dbToon); } @@ -314,10 +310,7 @@ namespace DiIiS_NA.LoginServer.Toons public ToonClass Class { - get - { - return _toonClass; - } + get => _toonClass; private set { /*var dbToon = this.DBToon; @@ -329,28 +322,28 @@ namespace DiIiS_NA.LoginServer.Toons switch (_toonClass) { case ToonClass.Barbarian: - this.HeroClassField.Value = 0x4FB91EE2; + HeroClassField.Value = 0x4FB91EE2; break; case ToonClass.Crusader: - this.HeroClassField.Value = unchecked((int)0xBE27DC19); + HeroClassField.Value = unchecked((int)0xBE27DC19); break; case ToonClass.DemonHunter: - this.HeroClassField.Value = unchecked((int)0xC88B9649); + HeroClassField.Value = unchecked((int)0xC88B9649); break; case ToonClass.Monk: - this.HeroClassField.Value = 0x3DAC15; + HeroClassField.Value = 0x3DAC15; break; case ToonClass.WitchDoctor: - this.HeroClassField.Value = 0x343C22A; + HeroClassField.Value = 0x343C22A; break; case ToonClass.Wizard: - this.HeroClassField.Value = 0x1D4681B1; + HeroClassField.Value = 0x1D4681B1; break; case ToonClass.Necromancer: - this.HeroClassField.Value = 0x8D4D94ED;//unchecked((int)0x8D4D94ED); + HeroClassField.Value = 0x8D4D94ED;//unchecked((int)0x8D4D94ED); break; default: - this.HeroClassField.Value = 0x0; + HeroClassField.Value = 0x0; break; } } @@ -361,16 +354,13 @@ namespace DiIiS_NA.LoginServer.Toons /// public ToonFlags Flags { - get - { - return this._flags;// | ToonFlags.AllUnknowns; - } + get => _flags; // | ToonFlags.AllUnknowns; set { - this._flags = value; - lock (this.DBToon) + _flags = value; + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Flags = value; DBSessions.SessionUpdate(dbToon); } @@ -391,19 +381,19 @@ namespace DiIiS_NA.LoginServer.Toons { get { - if (_levelChanged || !LoginServer.Config.Instance.Enabled) + if (_levelChanged || !Config.Instance.Enabled) { - _cachedLevel = this.DBToon.Level; + _cachedLevel = DBToon.Level; _levelChanged = false; } - return this._cachedLevel; + return _cachedLevel; } private set { - lock (this.DBToon) + lock (DBToon) { _cachedLevel = value; - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Level = value; DBSessions.SessionUpdate(dbToon); } @@ -420,20 +410,20 @@ namespace DiIiS_NA.LoginServer.Toons { get { - if (_paragonLevelChanged || !LoginServer.Config.Instance.Enabled) + if (_paragonLevelChanged || !Config.Instance.Enabled) { - this._cachedParagonLevel = this.GameAccount.DBGameAccount.ParagonLevel; + _cachedParagonLevel = GameAccount.DBGameAccount.ParagonLevel; _paragonLevelChanged = false; } - return this._cachedParagonLevel; + return _cachedParagonLevel; } private set { - lock (this.GameAccount.DBGameAccount) + lock (GameAccount.DBGameAccount) { - this._cachedParagonLevel = value; - var dbGAcc = this.GameAccount.DBGameAccount; - if (this.IsHardcore) + _cachedParagonLevel = value; + var dbGAcc = GameAccount.DBGameAccount; + if (IsHardcore) dbGAcc.ParagonLevelHardcore = value; else dbGAcc.ParagonLevel = value; @@ -447,16 +437,16 @@ namespace DiIiS_NA.LoginServer.Toons /// public long ExperienceNext { - get { return (this.Level >= 70 ? this.ParagonExperienceNext : this.DBToon.Experience); } + get => (Level >= 70 ? ParagonExperienceNext : DBToon.Experience); set { - if (this.Level >= 70) - this.ParagonExperienceNext = value; + if (Level >= 70) + ParagonExperienceNext = value; else { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.Experience = value; DBSessions.SessionUpdate(dbToon); } @@ -466,13 +456,13 @@ namespace DiIiS_NA.LoginServer.Toons public long ParagonExperienceNext { - get { return (this.IsHardcore ? this.GameAccount.DBGameAccount.ExperienceHardcore : this.GameAccount.DBGameAccount.Experience); } + get => (IsHardcore ? GameAccount.DBGameAccount.ExperienceHardcore : GameAccount.DBGameAccount.Experience); set { - lock (this.GameAccount.DBGameAccount) + lock (GameAccount.DBGameAccount) { - var dbGAcc = this.GameAccount.DBGameAccount; - if (this.IsHardcore) + var dbGAcc = GameAccount.DBGameAccount; + if (IsHardcore) dbGAcc.ExperienceHardcore = value; else dbGAcc.Experience = value; @@ -483,12 +473,12 @@ namespace DiIiS_NA.LoginServer.Toons public int CurrentAct { - get { return this.DBToon.CurrentAct; } + get => DBToon.CurrentAct; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.CurrentAct = value; DBSessions.SessionUpdate(dbToon); } @@ -497,12 +487,12 @@ namespace DiIiS_NA.LoginServer.Toons public int CurrentQuestId { - get { return this.DBToon.CurrentQuestId; } + get => DBToon.CurrentQuestId; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.CurrentQuestId = value; DBSessions.SessionUpdate(dbToon); } @@ -511,12 +501,12 @@ namespace DiIiS_NA.LoginServer.Toons public int PvERating { - get { return this.DBToon.PvERating; } + get => DBToon.PvERating; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.PvERating = value; DBSessions.SessionUpdate(dbToon); } @@ -525,12 +515,12 @@ namespace DiIiS_NA.LoginServer.Toons public int CurrentQuestStepId { - get { return this.DBToon.CurrentQuestStepId; } + get => DBToon.CurrentQuestStepId; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.CurrentQuestStepId = value; DBSessions.SessionUpdate(dbToon); } @@ -539,12 +529,12 @@ namespace DiIiS_NA.LoginServer.Toons public int CurrentDifficulty { - get { return this.DBToon.CurrentDifficulty; } + get => DBToon.CurrentDifficulty; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.CurrentDifficulty = value; DBSessions.SessionUpdate(dbToon); } @@ -555,11 +545,9 @@ namespace DiIiS_NA.LoginServer.Toons /// Killed monsters(total for account) /// public ulong TotalKilled { - get { - return this.GameAccount.DBGameAccount.TotalKilled; - } + get => GameAccount.DBGameAccount.TotalKilled; set { - var dbGA = this.GameAccount.DBGameAccount; + var dbGA = GameAccount.DBGameAccount; lock (dbGA) { dbGA.TotalKilled = value; DBSessions.SessionUpdate(dbGA); @@ -570,11 +558,9 @@ namespace DiIiS_NA.LoginServer.Toons /// Killed elites(total for account) /// public ulong ElitesKilled { - get { - return this.GameAccount.DBGameAccount.ElitesKilled; - } + get => GameAccount.DBGameAccount.ElitesKilled; set { - var dbGA = this.GameAccount.DBGameAccount; + var dbGA = GameAccount.DBGameAccount; lock (dbGA) { dbGA.ElitesKilled = value; DBSessions.SessionUpdate(dbGA); @@ -587,17 +573,17 @@ namespace DiIiS_NA.LoginServer.Toons /// public int TotalBounties { get { - if (this.IsHardcore) { - return this.GameAccount.DBGameAccount.TotalBountiesHardcore; + if (IsHardcore) { + return GameAccount.DBGameAccount.TotalBountiesHardcore; } else { - return this.GameAccount.DBGameAccount.TotalBounties; + return GameAccount.DBGameAccount.TotalBounties; } } set { - var dbGA = this.GameAccount.DBGameAccount; + var dbGA = GameAccount.DBGameAccount; lock (dbGA) { - if (this.IsHardcore) { + if (IsHardcore) { dbGA.TotalBountiesHardcore = value; } else { @@ -613,10 +599,10 @@ namespace DiIiS_NA.LoginServer.Toons /// public int SeasonalKills { - get { return this.DBToon.Kills; } + get => DBToon.Kills; set { - var dbToon = this.DBToon; + var dbToon = DBToon; lock (dbToon) { dbToon.Kills = value; @@ -630,17 +616,17 @@ namespace DiIiS_NA.LoginServer.Toons /// public ulong CollectedGold { get { - if (this.IsHardcore) { - return this.GameAccount.DBGameAccount.HardTotalGold; + if (IsHardcore) { + return GameAccount.DBGameAccount.HardTotalGold; } else { - return this.GameAccount.DBGameAccount.TotalGold; + return GameAccount.DBGameAccount.TotalGold; } } set { - var dbGAcc = this.GameAccount.DBGameAccount; + var dbGAcc = GameAccount.DBGameAccount; lock (dbGAcc) { - if (this.IsHardcore) { + if (IsHardcore) { dbGAcc.HardTotalGold = value; } else { @@ -656,12 +642,12 @@ namespace DiIiS_NA.LoginServer.Toons /// public int CollectedGoldSeasonal { - get { return this.DBToon.GoldGained; } + get => DBToon.GoldGained; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.GoldGained = value; DBSessions.SessionUpdate(dbToon); } @@ -673,12 +659,12 @@ namespace DiIiS_NA.LoginServer.Toons /// public int TimePlayed { - get { return this.DBToon.TimePlayed; } + get => DBToon.TimePlayed; set { - lock (this.DBToon) + lock (DBToon) { - var dbToon = this.DBToon; + var dbToon = DBToon; dbToon.TimePlayed = value; DBSessions.SessionUpdate(dbToon); } @@ -701,14 +687,8 @@ namespace DiIiS_NA.LoginServer.Toons private D3.Client.ToonSettings _settings = D3.Client.ToonSettings.CreateBuilder().Build(); public D3.Client.ToonSettings Settings { - get - { - return D3.Client.ToonSettings.CreateBuilder().SetUiFlags(0xFFFFFFFF).Build();//this._settings; - } - set - { - this._settings = value; - } + get => D3.Client.ToonSettings.CreateBuilder().SetUiFlags(0xFFFFFFFF).Build(); //this._settings; + set => _settings = value; } /// @@ -719,20 +699,20 @@ namespace DiIiS_NA.LoginServer.Toons { get { - var dbToon = this.DBToon; - if (this.IsHardcore) dbToon.Flags |= ToonFlags.Hardcore; + var dbToon = DBToon; + if (IsHardcore) dbToon.Flags |= ToonFlags.Hardcore; //var isSeason = Convert.ToUInt16(isSeassoned); var digest = D3.Hero.Digest.CreateBuilder().SetVersion(905) - .SetHeroId(this.D3EntityID) - .SetHeroName(this.Name) - .SetGbidClass((int)this.ClassID) - .SetLevel(this.Level) + .SetHeroId(D3EntityID) + .SetHeroName(Name) + .SetGbidClass((int)ClassID) + .SetLevel(Level) //deprecated //.SetAltLevel(dbToon.ParagonLevel) .SetPlayerFlags((uint)dbToon.Flags)// + isSeason) - .SetSeasonCreated((uint)this.SeasonCreated) + .SetSeasonCreated((uint)SeasonCreated) - .SetVisualEquipment(this.HeroVisualEquipmentField.Value) + .SetVisualEquipment(HeroVisualEquipmentField.Value) .SetLastPlayedAct(dbToon.CurrentAct) .SetHighestUnlockedAct(3000) //deprecated //.SetLastPlayedDifficulty(dbToon.CurrentDifficulty) @@ -743,7 +723,7 @@ namespace DiIiS_NA.LoginServer.Toons .SetLastPlayedQuestStep(dbToon.CurrentQuestStepId) .SetTimePlayed((uint)dbToon.TimePlayed); - if (!this.IsHardcore) + if (!IsHardcore) { foreach (var quest in _allQuests) { @@ -753,7 +733,7 @@ namespace DiIiS_NA.LoginServer.Toons else { IEnumerable _dbQuests = null; - _dbQuests = DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == this.PersistentID); + _dbQuests = DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == PersistentID); #if DEBUG digest .AddQuestHistory(D3.Hero.QuestHistoryEntry.CreateBuilder().SetDifficultyDeprecated(0).SetSnoQuest(87700)) @@ -833,7 +813,7 @@ namespace DiIiS_NA.LoginServer.Toons get { var itemList = D3.Items.ItemList.CreateBuilder(); - List heroInventoryItems = DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == this.PersistentID); + List heroInventoryItems = DBSessions.SessionQueryWhere(dbi => dbi.DBToon.Id == PersistentID); //* foreach (var invItem in heroInventoryItems) { @@ -842,7 +822,7 @@ namespace DiIiS_NA.LoginServer.Toons .SetId(D3.OnlineService.ItemId.CreateBuilder().SetIdLow(0).SetIdHigh(0x3C000002517A293 + (ulong)invItem.Id)) .SetHirelingClass(0) .SetItemSlot(272 + (invItem.EquipmentSlot * 16)) - .SetOwnerEntityId(this.D3EntityID) + .SetOwnerEntityId(D3EntityID) .SetSquareIndex(0) .SetUsedSocketCount(0); @@ -906,15 +886,15 @@ namespace DiIiS_NA.LoginServer.Toons itemList.AddItems(item.Build()); } //*/ - var dbToon = this.DBToon; + var dbToon = DBToon; string[] stats = dbToon.Stats.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); var profile = D3.Profile.HeroProfile.CreateBuilder() - .SetHardcore(this.IsHardcore) + .SetHardcore(IsHardcore) .SetDeathTime(1476016727) //deprecated //.SetLife(0) .SetSnoKillLocation(71150) .SetKillerInfo(D3.Profile.KillerInfo.CreateBuilder().SetSnoKiller(6031).SetRarity(4)) - .SetHeroId(this.D3EntityID) + .SetHeroId(D3EntityID) //deprecated //.SetHighestDifficulty(0) .SetHighestLevel(dbToon.Level) //.SetMonstersKilled(111) @@ -937,9 +917,9 @@ namespace DiIiS_NA.LoginServer.Toons //.SetResistCold(110) //.SetResistPoison(111) .SetEquipment(itemList); - if (this.DBActiveSkills != null) + if (DBActiveSkills != null) { - var dbActiveSkills = this.DBActiveSkills; + var dbActiveSkills = DBActiveSkills; var skills = new[]{ D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill0).SetRuneType(dbActiveSkills.Rune0).Build(), D3.Profile.SkillWithRune.CreateBuilder().SetSkill(dbActiveSkills.Skill1).SetRuneType(dbActiveSkills.Rune1).Build(), @@ -973,11 +953,11 @@ namespace DiIiS_NA.LoginServer.Toons { get { - if (!this.GameAccount.IsOnline) return false; + if (!GameAccount.IsOnline) return false; else { - if (this.GameAccount.CurrentToon != null) - return this.GameAccount.CurrentToon == this; + if (GameAccount.CurrentToon != null) + return GameAccount.CurrentToon == this; else return false; } @@ -988,7 +968,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - switch (this.Class) + switch (Class) { case ToonClass.Barbarian: return 0x4FB91EE2; @@ -1014,7 +994,7 @@ namespace DiIiS_NA.LoginServer.Toons { get { - switch (this.Class) + switch (Class) { case ToonClass.DemonHunter: return 0; @@ -1035,62 +1015,56 @@ namespace DiIiS_NA.LoginServer.Toons } } - public int Gender - { - get - { - return (int)(this.Flags & ToonFlags.Female); - } - } + public int Gender => (int)(Flags & ToonFlags.Female); #region c-tor and setfields public readonly Core.MPQ.FileFormats.GameBalance.HeroTable HeroTable; private readonly Dictionary visualToSlotMapping = new Dictionary { { 1, 0 }, { 2, 1 }, { 7, 2 }, { 5, 3 }, { 4, 4 }, { 3, 5 }, { 8, 6 }, { 9, 7 } }; - private static readonly DiIiS_NA.Core.MPQ.FileFormats.GameBalance HeroData = (DiIiS_NA.Core.MPQ.FileFormats.GameBalance)MPQStorage.Data.Assets[SNOGroup.GameBalance][19740].Data; + private static readonly Core.MPQ.FileFormats.GameBalance HeroData = (Core.MPQ.FileFormats.GameBalance)MPQStorage.Data.Assets[SNOGroup.GameBalance][19740].Data; public Toon(DBToon dbToon, GameDBSession DBSession = null) : base(dbToon.Id) { - this.D3EntityID = D3.OnlineService.EntityId.CreateBuilder().SetIdHigh((ulong)EntityIdHelper.HighIdType.ToonId).SetIdLow(this.PersistentID).Build(); - this._heroName = dbToon.Name; - this._flags = dbToon.Flags; - this.GameAccountId = dbToon.DBGameAccount.Id; - this._toonClass = dbToon.Class; + D3EntityID = D3.OnlineService.EntityId.CreateBuilder().SetIdHigh((ulong)EntityIdHelper.HighIdType.ToonId).SetIdLow(PersistentID).Build(); + _heroName = dbToon.Name; + _flags = dbToon.Flags; + GameAccountId = dbToon.DBGameAccount.Id; + _toonClass = dbToon.Class; - this.DBToon = dbToon; + DBToon = dbToon; this.DBSession = DBSession; - this.IsHardcore = dbToon.isHardcore; - this.isSeassoned = dbToon.isSeasoned; - this.HeroTable = HeroData.Heros.Find(item => item.Name == this.Class.ToString()); + IsHardcore = dbToon.isHardcore; + IsSeasoned = dbToon.isSeasoned; + HeroTable = HeroData.Heros.Find(item => item.Name == Class.ToString()); } #endregion public void LevelUp() { - this.Level++; - this.GameAccount.ChangedFields.SetIntPresenceFieldValue(this.HeroLevelField); + Level++; + GameAccount.ChangedFields.SetIntPresenceFieldValue(HeroLevelField); } public void ParagonLevelUp() { - this.ParagonLevel++; - this.GameAccount.ChangedFields.SetIntPresenceFieldValue(this.HeroParagonLevelField); + ParagonLevel++; + GameAccount.ChangedFields.SetIntPresenceFieldValue(HeroParagonLevelField); } private List _allQuests = new List() { 87700, 72095, 72221, 72061, 117779, 72738, 73236, 72546, 72801, 136656, 80322, 93396, 74128, 57331, 78264, 78266, 57335, 57337, 121792, 57339, 93595, 93684, 93697, 203595, 101756, 101750, 101758, 112498, 113910, 114795, 114901, 251355, 284683, 285098, 257120, 263851, 273790, 269552, 273408 }; public void UnlockAllQuests() { - var questList = DBSessions.SessionQueryWhere(qh => qh.DBToon.Id == this.PersistentID); + var questList = DBSessions.SessionQueryWhere(qh => qh.DBToon.Id == PersistentID); foreach (var quest in _allQuests) { if (!questList.Any(qh => qh.QuestId == quest)) { var questHistory = new DBQuestHistory(); - questHistory.DBToon = this.DBToon; + questHistory.DBToon = DBToon; questHistory.QuestId = quest; questHistory.QuestStep = -1; questHistory.isCompleted = true; @@ -1126,14 +1100,14 @@ namespace DiIiS_NA.LoginServer.Toons public override List GetSubscriptionNotifications() { var operationList = new List(); - operationList.Add(this.HeroClassField.GetFieldOperation()); - operationList.Add(this.HeroLevelField.GetFieldOperation()); - operationList.Add(this.HeroParagonLevelField.GetFieldOperation()); - operationList.Add(this.HeroVisualEquipmentField.GetFieldOperation()); - operationList.Add(this.HeroFlagsField.GetFieldOperation()); - operationList.Add(this.HeroNameField.GetFieldOperation()); - operationList.Add(this.HighestUnlockedAct.GetFieldOperation()); - operationList.Add(this.HighestUnlockedDifficulty.GetFieldOperation()); + operationList.Add(HeroClassField.GetFieldOperation()); + operationList.Add(HeroLevelField.GetFieldOperation()); + operationList.Add(HeroParagonLevelField.GetFieldOperation()); + operationList.Add(HeroVisualEquipmentField.GetFieldOperation()); + operationList.Add(HeroFlagsField.GetFieldOperation()); + operationList.Add(HeroNameField.GetFieldOperation()); + operationList.Add(HighestUnlockedAct.GetFieldOperation()); + operationList.Add(HighestUnlockedDifficulty.GetFieldOperation()); return operationList; } @@ -1164,7 +1138,7 @@ namespace DiIiS_NA.LoginServer.Toons public override string ToString() { - return String.Format("{{ Toon: {0} [lowId: {1}] }}", this.Name, this.D3EntityID.IdLow); + return String.Format("{{ Toon: {0} [lowId: {1}] }}", Name, D3EntityID.IdLow); } } diff --git a/src/DiIiS-NA/Core/Logging/AnsiTarget.cs b/src/DiIiS-NA/Core/Logging/AnsiTarget.cs index e582a3a..6a31edf 100644 --- a/src/DiIiS-NA/Core/Logging/AnsiTarget.cs +++ b/src/DiIiS-NA/Core/Logging/AnsiTarget.cs @@ -64,9 +64,9 @@ public class AnsiTarget : LogTarget .Replace("Blizzless", "[dodgerblue1]Blizz[/][deepskyblue2]less[/]", StringComparison.CurrentCultureIgnoreCase) .Replace("Diablo III", "[red3_1]Diablo[/] [red]III[/]", StringComparison.CurrentCultureIgnoreCase) .Replace("MPQ", "[underline yellow4]MPQ[/]") - .Replace("Discord", "[blue]Discord[/]", StringComparison.CurrentCultureIgnoreCase) + .Replace("Discord", "[underline blue]Discord[/]", StringComparison.CurrentCultureIgnoreCase) .Replace("not null", "[green]is not null[/]", StringComparison.CurrentCultureIgnoreCase) - .Replace("null", "[red]is null[/]", StringComparison.CurrentCultureIgnoreCase); + .Replace("null", "[underline red]is null[/]", StringComparison.CurrentCultureIgnoreCase); } diff --git a/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs b/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs index e0e579a..f7220b8 100644 --- a/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs +++ b/src/DiIiS-NA/D3-GameServer/AchievementSystem/AchievementManager.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Net; using System.Text; using System.Threading.Tasks; @@ -17,33 +18,39 @@ namespace DiIiS_NA.GameServer.AchievementSystem { public class AchievementManager : RPCObject { - private static readonly AchievementManager _instance = new AchievementManager(); - public static AchievementManager Instance { get { return _instance; } } - public static string AchievementFileHash = "2c11c0ec90a821ecc3dac6b81db355b2a2ff9f15e1d4f9512f3a96380c980887"; - public static string AchievementFilename = AchievementFileHash + ".achu"; - public static string AchievementURL = "http://eu.depot.battle.net:1119/" + AchievementFilename; + public static AchievementManager Instance = new(); + private static readonly string _achievementFileHash = "2c11c0ec90a821ecc3dac6b81db355b2a2ff9f15e1d4f9512f3a96380c980887"; + private static readonly string _achievementFilename = $"{_achievementFileHash}.achu"; + private static readonly string _achievementHost = $"eu.depot.battle.net"; + private static readonly string _achievementUrl = $"http://{_achievementHost}:1119/{_achievementFilename}"; - public static D3.AchievementsStaticData.AchievementFile Achievements; + private static D3.AchievementsStaticData.AchievementFile _achievements; public static void Initialize() { - if (File.Exists(Path.Combine(FileHelpers.AssemblyRoot, AchievementFilename))) + if (File.Exists(Path.Combine(FileHelpers.AssemblyRoot, _achievementFilename))) { - var br = new BinaryReader(File.Open(Path.Combine(FileHelpers.AssemblyRoot, AchievementFilename), FileMode.Open)); - Achievements = D3.AchievementsStaticData.AchievementFile.ParseFrom(br.ReadBytes((int)br.BaseStream.Length)); + var br = new BinaryReader(File.Open(Path.Combine(FileHelpers.AssemblyRoot, _achievementFilename), FileMode.Open)); + _achievements = D3.AchievementsStaticData.AchievementFile.ParseFrom(br.ReadBytes((int)br.BaseStream.Length)); br.Close(); - Logger.Info("Achievements loaded from file."); + Logger.Info($"$[underline white]${_achievements.AchievementCount} achievements$[/]$ loaded from file."); } else { - Logger.Info("Achimevement file not founded! Try download..."); + Logger.Info("Achievement file not found! Trying to download..."); + var hostEntry = Dns.GetHostEntry(_achievementHost); + if (hostEntry.AddressList.Length == 0) + { + Logger.Fatal($"Unable to resolve host $[darkred]${_achievementHost}$[/]$!"); + return; + } var attempts = 0; byte[] data = new byte[] { }; while (attempts < 5) { try { - data = new System.Net.WebClient().DownloadData(AchievementURL); + data = new System.Net.WebClient().DownloadData(_achievementUrl); break; } catch (System.Net.WebException) @@ -53,27 +60,27 @@ namespace DiIiS_NA.GameServer.AchievementSystem } try { - Achievements = D3.AchievementsStaticData.AchievementFile.ParseFrom(data); + _achievements = D3.AchievementsStaticData.AchievementFile.ParseFrom(data); if (attempts < 5) { - var br = new BinaryWriter(File.Open(AchievementFilename, FileMode.CreateNew)); + var br = new BinaryWriter(File.Open(_achievementFilename, FileMode.CreateNew)); br.Write(data); br.Close(); } else { - Logger.Error("Error of Downloading."); + Logger.Error("Error Downloading achievement (.achu)."); } } catch (Google.ProtocolBuffers.InvalidProtocolBufferException) { - Achievements = D3.AchievementsStaticData.AchievementFile.CreateBuilder().Build(); - Logger.Error("File was downloaded, but error of read."); + _achievements = D3.AchievementsStaticData.AchievementFile.CreateBuilder().Build(); + Logger.Error("File was downloaded, but there was an error of read."); } catch (IOException) { - Logger.Error("{0} error permission.", AchievementFilename); + Logger.Error("{0} IO error.", _achievementFilename); } } @@ -81,29 +88,29 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static int TotalAchievements { - get { return Achievements.AchievementCount; } + get { return _achievements.AchievementCount; } } public static int TotalCategories { - get { return Achievements.CategoryCount; } + get { return _achievements.CategoryCount; } } public static int TotalCriteria { - get { return Achievements.CriteriaCount; } + get { return _achievements.CriteriaCount; } } public static IList GetAllAchievements { - get { return Achievements.AchievementList; } + get { return _achievements.AchievementList; } } public static bool IsHardcore(ulong achId) { - ulong category_id = Achievements.AchievementList.Single(a => a.Id == achId).CategoryId; + ulong category_id = _achievements.AchievementList.Single(a => a.Id == achId).CategoryId; while (category_id != 0) { if (category_id == 5505028) return true; - var category_data = Achievements.CategoryList.Single(a => a.Id == category_id); + var category_data = _achievements.CategoryList.Single(a => a.Id == category_id); if (!category_data.HasParentId) break; @@ -122,7 +129,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static D3.AchievementsStaticData.StaticAchievementDefinition GetAchievementById(ulong id) { - D3.AchievementsStaticData.StaticAchievementDefinition Achi = Achievements.AchievementList.Where(ach => ach.Id == id).FirstOrDefault(); + D3.AchievementsStaticData.StaticAchievementDefinition Achi = _achievements.AchievementList.Where(ach => ach.Id == id).FirstOrDefault(); if (Achi != null) return Achi; else @@ -150,14 +157,14 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static ulong GetMainCriteria(ulong achievementId) { - return Achievements.CriteriaList.Where(c => + return _achievements.CriteriaList.Where(c => c.ParentAchievementId == achievementId ).Select(c => c.CriteriaId).FirstOrDefault(); } public static List GetCriterias(ulong achievementId) { - var a = Achievements.CriteriaList.Where(c => + var a = _achievements.CriteriaList.Where(c => c.ParentAchievementId == achievementId ).Select(c => c).ToList(); return a; @@ -219,7 +226,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem if (client.Account.GameAccount.Clan != null) client.Account.GameAccount.Clan.AddNews(client.Account.GameAccount, 1, D3.Guild.AchievementNews.CreateBuilder().SetAchievementId(achievementId).Build().ToByteArray()); - var criterias = Achievements.CriteriaList.Where(c => + var criterias = _achievements.CriteriaList.Where(c => (c.AdvanceEvent.Id == 200 && c.AdvanceEvent.Comparand == achievementId) ).ToList(); foreach (var criteria in criterias) @@ -239,7 +246,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem uint UCriteriaId = (uint)criteriaId; - var criteria_datas = Achievements.CriteriaList.Where(c => c.CriteriaId == criteriaId).ToList(); + var criteria_datas = _achievements.CriteriaList.Where(c => c.CriteriaId == criteriaId).ToList(); if (criteriaId != 3367569) { if (criteria_datas.Count == 0) @@ -290,7 +297,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem client.Account.GameAccount.AchievementCriteria.Add(record); int critCount = UnserializeBytes(achievement.Criteria).Count; - int neededCritCount = Achievements.CriteriaList.Where(c => c.ParentAchievementId == definition.ParentAchievementId).ToList().Count; + int neededCritCount = _achievements.CriteriaList.Where(c => c.ParentAchievementId == definition.ParentAchievementId).ToList().Count; if (critCount >= neededCritCount) { @@ -298,7 +305,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem return; } - var ach_data = Achievements.AchievementList.Single(a => a.Id == definition.ParentAchievementId); + var ach_data = _achievements.AchievementList.Single(a => a.Id == definition.ParentAchievementId); if (!ach_data.HasSupersedingAchievementId || client.Account.GameAccount.Achievements.Where(a => a.AchievementId == ach_data.SupersedingAchievementId && a.Completion > 0).Count() > 0) UpdateSnapshot(client, 0, criteriaId); } @@ -386,7 +393,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem .SetQuantity32(0) .Build(); - var criteria_data = Achievements.CriteriaList.Single(c => c.CriteriaId == mainCriteriaId); + var criteria_data = _achievements.CriteriaList.Single(c => c.CriteriaId == mainCriteriaId); uint newQuantity = Math.Min(mainCriteria.Quantity32 + additionalQuantity, (uint)criteria_data.NecessaryQuantity); @@ -427,7 +434,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem client.Account.GameAccount.AchievementCriteria.Add( mainCriteria.ToBuilder().SetQuantity32(newQuantity).Build() ); - var ach_data = Achievements.AchievementList.Single(a => a.Id == achievementId); + var ach_data = _achievements.AchievementList.Single(a => a.Id == achievementId); if (!ach_data.HasSupersedingAchievementId/* || client.Account.GameAccount.Achievements.Where(a => a.AchievementId == ach_data.SupersedingAchievementId && a.Completion > 0).Count() > 0*/) UpdateSnapshot(client, 0, (ulong)mainCriteria.CriteriaId32AndFlags8, newQuantity); } @@ -436,7 +443,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static void UpdateAllCounters(BattleClient client, int type, uint addCounter, int comparand) { - var criterias = Achievements.CriteriaList.Where(c => c.AdvanceEvent.Id == (ulong)type); + var criterias = _achievements.CriteriaList.Where(c => c.AdvanceEvent.Id == (ulong)type); if (comparand != -1) criterias = criterias.Where(c => c.AdvanceEvent.ModifierList.First().Comparand == (ulong)comparand); foreach (var criteria in criterias) @@ -447,7 +454,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static void CheckQuestCriteria(BattleClient client, int questId, bool isCoop) { - var criterias = Achievements.CriteriaList.Where(c => + var criterias = _achievements.CriteriaList.Where(c => (c.AdvanceEvent.Id == 406 && c.AdvanceEvent.Comparand == Convert.ToUInt64(questId)) && (isCoop ? true : (c.AdvanceEvent.ModifierCount == 0)) @@ -508,7 +515,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static void CheckSalvageItemCriteria(BattleClient client, int itemGbId) { - var criterias = Achievements.CriteriaList.Where(c => + var criterias = _achievements.CriteriaList.Where(c => (c.AdvanceEvent.Id == 9 && c.AdvanceEvent.Comparand == Convert.ToUInt64(unchecked((ulong)itemGbId)))).ToList(); foreach (var criteria in criterias) GrantCriteria(client, criteria.CriteriaId); @@ -518,7 +525,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem { var actorId64 = Convert.ToUInt64(actorId); var type64 = Convert.ToUInt64(type); - var criterias = Achievements.CriteriaList.Where(c => + var criterias = _achievements.CriteriaList.Where(c => (c.AdvanceEvent.Id == 105 && c.AdvanceEvent.Comparand == actorId64)).ToList(); if (!isHardcore) @@ -532,7 +539,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem public static void CheckConversationCriteria(BattleClient client, int convId) { - var criterias = Achievements.CriteriaList.Where(c => + var criterias = _achievements.CriteriaList.Where(c => (c.AdvanceEvent.Id == 604 && c.AdvanceEvent.Comparand == Convert.ToUInt64(convId)) || (c.AdvanceEvent.Id == 601 && c.AdvanceEvent.Comparand == Convert.ToUInt64(convId)) @@ -545,7 +552,7 @@ namespace DiIiS_NA.GameServer.AchievementSystem { if (laId != -1) { - var criterias = Achievements.CriteriaList.Where(c => + var criterias = _achievements.CriteriaList.Where(c => (c.AdvanceEvent.Id == 407 && c.AdvanceEvent.Comparand == Convert.ToUInt64(laId)) ).ToList(); foreach (var criteria in criterias) diff --git a/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs b/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs index cbfb6bb..a9bf146 100644 --- a/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs +++ b/src/DiIiS-NA/D3-GameServer/CommandManager/GameCommands.cs @@ -19,7 +19,10 @@ using System.Linq; using DiIiS_NA.GameServer.GSSystem.GameSystem; using DiIiS_NA.GameServer.GSSystem.ObjectsSystem; using DiIiS_NA.GameServer.GSSystem.PlayerSystem; +using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Animation; +using DiIiS_NA.GameServer.MessageSystem.Message.Fields; using DiIiS_NA.LoginServer.AccountsSystem; +using FluentNHibernate.Utils; using static DiIiS_NA.Core.MPQ.FileFormats.GameBalance; namespace DiIiS_NA.GameServer.CommandManager @@ -78,22 +81,25 @@ namespace DiIiS_NA.GameServer.CommandManager { foreach (var world in game.Worlds) { - info.Add(""); - info.Add($" World: {world.SNO.ToString()} - {(int)world.SNO}"); - info.Add($" Players: {world.Players.Count}"); - info.Add($" Monsters: {world.Monsters.Count}"); + info.Add($"World: {world.SNO.ToString()} - {(int)world.SNO}"); + info.Add($"Players: {world.Players.Count}"); + info.Add($"Monsters: {world.Monsters.Count}"); + info.Add($"{world.Monsters.Count} players in world: "); foreach (var playerInWorld in world.Players) { - info.Add($">>>>> Player[{playerInWorld.Value.PlayerIndex}] <<<<<"); - info.Add($"Id: {playerInWorld.Value.GlobalID}"); + info.Add($"> Player[{playerInWorld.Value.PlayerIndex}]"); + info.Add($"> Id: {playerInWorld.Value.GlobalID}"); // info.Add($"Index: {playerInWorld.Value.PlayerIndex}"); - info.Add($"Name: {playerInWorld.Value.Name}"); - info.Add($"Class: {playerInWorld.Value.Toon.Class.ToString()}"); - info.Add($"Level: {playerInWorld.Value.Toon.Level}"); + info.Add($"> Name: {playerInWorld.Value.Name}"); + info.Add($"> Class: {playerInWorld.Value.Toon.Class.ToString()}"); + info.Add($"> Level: {playerInWorld.Value.Toon.Level}"); info.Add( - $" Health: {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Cur]} / {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Max]}"); - info.Add($" Damage: {playerInWorld.Value.Attributes[GameAttribute.Damage_Min, 0]}"); + $"> Health: {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Cur]} / {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Max]}"); + info.Add($"> Damage: {playerInWorld.Value.Attributes[GameAttribute.Damage_Min, 0]}"); + info.Add(""); } + + info.Add(""); } } @@ -101,9 +107,43 @@ namespace DiIiS_NA.GameServer.CommandManager } } + [CommandGroup("identify", "Identifies all items in your inventory.", Account.UserLevels.Tester)] + public class IdentifyCommand + { + [DefaultCommand()] + public string Identify(string[] @params, BattleClient invokerClient) + { + if (invokerClient?.InGameClient?.Player is not { } player) + return "You must be in game to use this command."; + + var unidentified = player.Inventory.GetBackPackItems().Where(i => i.Unidentified).ToArray(); + int count = unidentified.Length; + player.StartCasting(60*2, new Action(() => + { + foreach (var item in unidentified) + item.Identify(); + })); + return $"Identified {count} items."; + } + } [CommandGroup("followers", "Manage your followers.", Account.UserLevels.Tester)] public class FollowersCommand : CommandGroup { + [Command("list", "List all followers.")] + public string List(string[] @params, BattleClient invokerClient) + { + if (invokerClient?.InGameClient?.Player is not { } player) + return "You must be in game to use this command."; + + List followers = new(); + foreach (var follower in player.Followers.OrderBy(s=>s.Value)) + { + followers.Add($"[{follower.Key}] {follower.Value.ToString()}"); + } + + return string.Join('\n', followers); + } + [Command("dismiss", "Dismisses all followers.")] public string DismissAllCommand(string[] @params, BattleClient invokerClient) { @@ -129,6 +169,8 @@ namespace DiIiS_NA.GameServer.CommandManager { if (invokerClient?.InGameClient is null) return "You must execute this command in-game."; + if (invokerClient.InGameClient.Player.World.Game.Difficulty == 19) + return "You can't increase difficulty any more."; invokerClient.InGameClient.Player.World.Game.RaiseDifficulty(invokerClient.InGameClient, null); return $"Difficulty increased - set to {invokerClient.InGameClient.Player.World.Game.Difficulty}"; } @@ -149,8 +191,8 @@ namespace DiIiS_NA.GameServer.CommandManager { if (invokerClient?.InGameClient is null) return "You must execute this command in-game."; - if (!int.TryParse(@params[0], out var difficulty) || difficulty is < 0 or > 100) - return "Invalid difficulty"; + if (!int.TryParse(@params[0], out var difficulty) || difficulty is < 0 or > 19) + return "Invalid difficulty. Must be between 0 and 19."; invokerClient.InGameClient.Player.World.Game.SetDifficulty(difficulty); return $"Difficulty set to {invokerClient.InGameClient.Player.World.Game.Difficulty}"; } @@ -621,12 +663,12 @@ namespace DiIiS_NA.GameServer.CommandManager try { for (int i = 0; i < amount; i++) - player.World.SpawnRandomEquip(player, player, 11, player.Level, toonClass: player.Toon.Class); + player.World.SpawnRandomEquip(player, player, 11, player.Level, toonClass: player.Toon.Class, canBeUnidentified: false); } catch { for (int i = 0; i < amount; i++) - player.World.SpawnRandomEquip(player, player, 8, player.Level, toonClass: player.Toon.Class); + player.World.SpawnRandomEquip(player, player, 8, player.Level, toonClass: player.Toon.Class, canBeUnidentified: false); } return $"Dropped {amount} random equipment."; } diff --git a/src/DiIiS-NA/D3-GameServer/Config.cs b/src/DiIiS-NA/D3-GameServer/Config.cs index d8861f6..b5d1f83 100644 --- a/src/DiIiS-NA/D3-GameServer/Config.cs +++ b/src/DiIiS-NA/D3-GameServer/Config.cs @@ -10,90 +10,121 @@ namespace DiIiS_NA.GameServer { public bool Enabled { - get => GetBoolean("Enabled", true); - set => Set("Enabled", value); + get => GetBoolean(nameof(Enabled), true); + set => Set(nameof(Enabled), value); } public string BindIP { - get => GetString("BindIP", "127.0.0.1"); - set => Set("BindIP", value); + get => GetString(nameof(BindIP), "127.0.0.1"); + set => Set(nameof(BindIP), value); } public int WebPort { - get => GetInt("WebPort", 9001); - set => Set("WebPort", value); + get => GetInt(nameof(WebPort), 9001); + set => Set(nameof(WebPort), value); } public int Port { - get => GetInt("Port", 1345); - set => Set("Port", value); + get => GetInt(nameof(Port), 1345); + set => Set(nameof(Port), value); } public string BindIPv6 { - get => GetString("BindIPv6", "::1"); - set => Set("BindIPv6", value); + get => GetString(nameof(BindIPv6), "::1"); + set => Set(nameof(BindIPv6), value); } public bool DRLGemu { - get => GetBoolean("DRLGemu", true); - set => Set("DRLGemu", value); + get => GetBoolean(nameof(DRLGemu), true); + set => Set(nameof(DRLGemu), value); } public bool CoreActive { - get => GetBoolean("CoreActive", true); - set => Set("CoreActive", value); + get => GetBoolean(nameof(CoreActive), true); + set => Set(nameof(CoreActive), value); } - //Modding of Game-Server - public float RateEXP + /// + /// Rate of experience gain. + /// + public float RateExp { - get => GetFloat("RateExp", 1); - set => Set("RateExp", value); + get => GetFloat(nameof(RateExp), 1); + set => Set(nameof(RateExp), value); } + /// + /// Rate of gold gain. + /// public float RateMoney { - get => GetFloat("RateMoney", 1); - set => Set("RateMoney", value); + get => GetFloat(nameof(RateMoney), 1); + set => Set(nameof(RateMoney), value); } + /// + /// Rate of item drop. + /// public float RateDrop { - get => GetFloat("RateDrop", 1); - set => Set("RateDrop", value); + get => GetFloat(nameof(RateDrop), 1); + set => Set(nameof(RateDrop), value); } public float RateChangeDrop { - get => GetFloat("RateChangeDrop", 1); - set => Set("RateChangeDrop", value); + get => GetFloat(nameof(RateChangeDrop), 1); + set => Set(nameof(RateChangeDrop), value); } + /// + /// Rate of monster's HP. + /// public float RateMonsterHP { - get => GetFloat("RateMonsterHP", 1); - set => Set("RateMonsterHP", value); + get => GetFloat(nameof(RateMonsterHP), 1); + set => Set(nameof(RateMonsterHP), value); } + /// + /// Rate of monster's damage. + /// public float RateMonsterDMG { - get => GetFloat("RateMonsterHP", 1); - set => Set("RateMonsterHP", value); + get => GetFloat(nameof(RateMonsterDMG), 1); + set => Set(nameof(RateMonsterDMG), value); } - - + public bool IWServer { - get => GetBoolean("IWServer", true); - set => Set("IWServer", value); + get => GetBoolean(nameof(IWServer), true); + set => Set(nameof(IWServer), value); } + /// + /// Percentage that a unique, legendary, set or special item created is unidentified + /// + public float ChanceHighQualityUnidentified + { + get => GetFloat(nameof(ChanceHighQualityUnidentified), 30f); + set => Set(nameof(ChanceHighQualityUnidentified), value); + } + + /// + /// Percentage that a normal item created is unidentified + /// + public float ChanceNormalUnidentified + { + get => GetFloat(nameof(ChanceNormalUnidentified), 5f); + set => Set(nameof(ChanceNormalUnidentified), value); + } + public static Config Instance { get; } = new(); private Config() : base("Game-Server") diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/MonsterBrain.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/MonsterBrain.cs index 7e2020c..c653719 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/MonsterBrain.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/AISystem/Brains/MonsterBrain.cs @@ -454,7 +454,7 @@ namespace DiIiS_NA.GameServer.GSSystem.AISystem.Brains { if (PresetPowers.ContainsKey(powerSNO)) { - Logger.Trace($"Monster $[red]$\"{Body.Name}\"$[/]$ already has power {powerSNO}."); + Logger.Debug($"Monster $[red]$\"{Body.Name}\"$[/]$ already has power {powerSNO}."); // Logger.Debug("AddPresetPower(): power sno {0} already defined for monster \"{1}\"", //powerSNO, this.Body.ActorSNO.Name); return; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Actor.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Actor.cs index 57b548c..75f7941 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Actor.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Actor.cs @@ -712,7 +712,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem AddHP(quantity, GuidingLight); } - public virtual void AddHP(float quantity, bool GuidingLight = false) + public virtual void AddHP(float quantity, bool guidingLight = false) { if (quantity > 0) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs index f0ba391..b57218c 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Hirelings/Hireling.cs @@ -307,7 +307,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations.Hirelings } } - public override void AddHP(float quantity, bool GuidingLight = false) + public override void AddHP(float quantity, bool guidingLight = false) { if (Dead) return; if (quantity == 0) return; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Kadala.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Kadala.cs index 468bede..35699aa 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Kadala.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ActorSystem/Implementations/Kadala.cs @@ -52,7 +52,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ActorSystem.Implementations ItemsSystem.Item item = _vendorGrid.GetItemByDynId(player, itemId); if (item == null) return; - if (player.Toon.isSeassoned) + if (player.Toon.IsSeasoned) { player.GrantCriteria(74987248526596); } diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs index 872f3b1..3159d5e 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/GameSystem/Game.cs @@ -1152,6 +1152,8 @@ namespace DiIiS_NA.GameServer.GSSystem.GameSystem public void SetDifficulty(int diff) { Difficulty = diff; + if (Difficulty < 0) Difficulty = 0; + if (Difficulty > 19) Difficulty = 19; diff++; if (diff > 0) { diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs index d7d6d28..5ea06ba 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/ItemsSystem/ItemGenerator.cs @@ -1015,7 +1015,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem // generates a random equip item (for vendors) public static Item GenerateRandomEquip(ActorSystem.Actor owner, int level, int minQuality = 1, int maxQuality = -1, ItemTypeTable type = null, ToonClass ownerClass = ToonClass.Unknown, - bool crafted = false) + bool crafted = false, bool canBeUnidentified = true) { if (level < 0) level = owner.Attributes[GameAttribute.Level]; int quality = minQuality; @@ -1053,7 +1053,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem legaDefinition.CrafterRequiredLevel = level; for (int i = 0; i < 6; i++) legaDefinition.MaxAffixLevel[i] = level; - return CreateItem(owner, legaDefinition, quality, crafted); + return CreateItem(owner, legaDefinition, quality, crafted, canBeUnidentified: canBeUnidentified); } var itemDefinition = GetRandom(AllowedItems.Values @@ -1083,7 +1083,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem , false //(quality > 8) ); - return CreateItem(owner, itemDefinition, quality, crafted); + return CreateItem(owner, itemDefinition, quality, crafted, canBeUnidentified: canBeUnidentified); } // generates a random dye (for vendors) @@ -1317,35 +1317,50 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem return clonedItem; } - public static Item GetRandomItemOfType(Player player, ItemTypeTable itemType) + public static Item GetRandomItemOfType(Player player, ItemTypeTable itemType, bool canBeUnidentified = true) { int minQuality = 1; if (ItemGroup.HierarchyToHashList(itemType).Contains(-740765630)) //jewelry minQuality = 3; Item item = GenerateRandomEquip(player, player.Level, minQuality, 10, itemType); - - item.Unidentified = FastRandom.Instance.Chance(10f); + if (canBeUnidentified) + RandomSetUnidentified(item); return item; } // Creates an item based on supplied definition. public static Item CreateItem(ActorSystem.Actor owner, ItemTable definition, int forceQuality = -1, - bool crafted = false, int seed = -1) + bool crafted = false, int seed = -1, bool canBeUnidentified = true) { - // Logger.Trace("Creating item: {0} [sno:{1}, gbid {2}]", definition.Name, definition.SNOActor, StringHashHelper.HashItemName(definition.Name)); - - if (definition == null) return null; + Logger.Debug("Creating item: $[underline blue]${0}$[/]$ [sno:$[underline blue]${1}$[/]$, gbid $[underline blue]${2}$[/]$]", definition.Name, definition.SNOActor, StringHashHelper.HashItemName(definition.Name)); Type type = GetItemClass(definition); - var item = (Item)Activator.CreateInstance(type, - new object[] { owner.World, definition, forceQuality, crafted, seed }); + var item = (Item)Activator.CreateInstance(type, owner.World, definition, forceQuality, crafted, seed); + if (item == null) + { + Logger.Warn($"Could not create item $[red]${definition.Name}$[/]$ [sno:$[red]${definition.SNOActor}$[/]$, gbid $[red]${StringHashHelper.HashItemName(definition.Name)}]$[/]$"); + return null; + } if (forceQuality == 9) item.Attributes[GameAttribute.Item_Quality_Level] = 9; - item.Unidentified = FastRandom.Instance.Chance(10f); + if (canBeUnidentified) + RandomSetUnidentified(item); return item; } + + /// + /// Randomly sets unidentified flag on item. + /// If the item is unique, legendary, special or set, it will have % chance to be unidentified. + /// Otherwise, it will have % chance to be unidentified. + /// + /// The item to set the flag + private static void RandomSetUnidentified(Item item) => item.Unidentified = + FastRandom.Instance.Chance(item.Name.Contains("unique", StringComparison.InvariantCultureIgnoreCase) + || item.ItemDefinition.Quality is ItemTable.ItemQuality.Legendary or ItemTable.ItemQuality.Special or ItemTable.ItemQuality.Set + ? Config.Instance.ChanceHighQualityUnidentified + : Config.Instance.ChanceNormalUnidentified); // Allows cooking a custom item. public static Item Cook(Player player, string name) @@ -1355,9 +1370,7 @@ namespace DiIiS_NA.GameServer.GSSystem.ItemsSystem //Unique items level scaling if (definition.Name.ToLower().Contains("unique") || - definition.Quality == ItemTable.ItemQuality.Legendary || - definition.Quality == ItemTable.ItemQuality.Special || - definition.Quality == ItemTable.ItemQuality.Set) + definition.Quality is ItemTable.ItemQuality.Legendary or ItemTable.ItemQuality.Special or ItemTable.ItemQuality.Set) { definition.ItemLevel = player.Attributes[GameAttribute.Level]; definition.RequiredLevel = player.Attributes[GameAttribute.Level]; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs index 6296a5e..a4a4c43 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/MapSystem/World.cs @@ -770,7 +770,8 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem }, actor); } - public Item SpawnRandomEquip(Actor source, Player player, int forceQuality = -1, int forceLevel = -1, GameBalance.ItemTypeTable type = null, ToonClass toonClass = ToonClass.Unknown) + public Item SpawnRandomEquip(Actor source, Player player, int forceQuality = -1, int forceLevel = -1, + GameBalance.ItemTypeTable type = null, bool canBeUnidentified = true, ToonClass toonClass = ToonClass.Unknown) { Logger.Debug("SpawnRandomEquip(): quality {0}", forceQuality); if (player != null) @@ -778,7 +779,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem int level = (forceLevel > 0 ? forceLevel : source.Attributes[GameAttribute.Level]); if (toonClass == ToonClass.Unknown && type == null) { - var item = ItemGenerator.GenerateRandomEquip(player, level, forceQuality, forceQuality); + var item = ItemGenerator.GenerateRandomEquip(player, level, forceQuality, forceQuality, canBeUnidentified: canBeUnidentified); if (item == null) return null; player.GroundItems[item.GlobalID] = item; @@ -787,7 +788,7 @@ namespace DiIiS_NA.GameServer.GSSystem.MapSystem } else { - var item = ItemGenerator.GenerateRandomEquip(player, level, forceQuality, forceQuality, type: type,ownerClass: toonClass); + var item = ItemGenerator.GenerateRandomEquip(player, level, forceQuality, forceQuality, type: type,ownerClass: toonClass, canBeUnidentified: canBeUnidentified); if (item == null) return null; player.GroundItems[item.GlobalID] = item; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs index cb34ae0..37aa124 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Inventory.cs @@ -1814,7 +1814,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem _achievementGranted = true; _owner.GrantAchievement(74987243307784); } - if (_owner.Toon.isSeassoned) + if (_owner.Toon.IsSeasoned) if (Int32.Parse(reward.ItemDefinition.Name.Split('_')[2]) >= 7) { _owner.GrantCriteria(74987245885431); diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs index 4cccfb9..7d9093f 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PlayerSystem/Player.cs @@ -167,10 +167,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem public bool EnableGolem = false; public bool IsInPvPWorld { - get - { - return (World != null && World.IsPvP); - } + get => (World != null && World.IsPvP); set { } } @@ -219,7 +216,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem /// /// ActorType = Player. /// - public override ActorType ActorType { get { return ActorType.Player; } } + public override ActorType ActorType => ActorType.Player; /// /// Revealed objects to player. @@ -256,10 +253,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem public int _spiritGenHit = 0; public int _SpiritGeneratorHit { - get - { - return _spiritGenHit; - } + get => _spiritGenHit; set { @@ -281,7 +275,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem private Hireling _questHireling = null; public Hireling ActiveHireling { - get { return _activeHireling; } + get => _activeHireling; set { if (value == null) @@ -318,7 +312,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } public Hireling QuestHireling { - get { return _questHireling; } + get => _questHireling; set { if (_questHireling != null) @@ -3928,13 +3922,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } } - public float TotalStrength - { - get - { - return Attributes[GameAttribute.Strength] + Inventory.GetItemBonus(GameAttribute.Strength_Item); - } - } + public float TotalStrength => Attributes[GameAttribute.Strength] + Inventory.GetItemBonus(GameAttribute.Strength_Item); public float Dexterity { @@ -3947,29 +3935,11 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } } - public float TotalDexterity - { - get - { - return Attributes[GameAttribute.Dexterity] + Inventory.GetItemBonus(GameAttribute.Dexterity_Item); - } - } + public float TotalDexterity => Attributes[GameAttribute.Dexterity] + Inventory.GetItemBonus(GameAttribute.Dexterity_Item); - public float Vitality - { - get - { - return Toon.HeroTable.Vitality + ((Level - 1) * 2); - } - } + public float Vitality => Toon.HeroTable.Vitality + ((Level - 1) * 2); - public float TotalVitality - { - get - { - return Attributes[GameAttribute.Vitality] + Inventory.GetItemBonus(GameAttribute.Vitality_Item); - } - } + public float TotalVitality => Attributes[GameAttribute.Vitality] + Inventory.GetItemBonus(GameAttribute.Vitality_Item); public float Intelligence { @@ -3982,13 +3952,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } } - public float TotalIntelligence - { - get - { - return Attributes[GameAttribute.Intelligence] + Inventory.GetItemBonus(GameAttribute.Intelligence_Item); - } - } + public float TotalIntelligence => Attributes[GameAttribute.Intelligence] + Inventory.GetItemBonus(GameAttribute.Intelligence_Item); public float PrimaryAttribute { @@ -4164,7 +4128,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem get { var result = new List(); - var quests = InGameClient.Game.QuestManager.Quests.Where(q => q.Value.Completed == true).ToList(); + var quests = InGameClient.Game.QuestManager.Quests.Where(q => q.Value.Completed).ToList(); foreach (var quest in quests) { InGameClient.SendMessage(new QuestUpdateMessage() @@ -4201,10 +4165,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } return _hirelingInfo; } - set - { - _hirelingInfo = value; - } + set => _hirelingInfo = value; } #endregion @@ -4718,7 +4679,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } } - public int castingsnopower = -1; + public int CastingSnoPower = -1; public void StartCasting(int durationTicks, Action result, int skillsno = -1) { @@ -4726,13 +4687,13 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem CastResult = result; Attributes[GameAttribute.Looping_Animation_Start_Time] = World.Game.TickCounter; Attributes[GameAttribute.Looping_Animation_End_Time] = World.Game.TickCounter + durationTicks; - castingsnopower = skillsno; - if (castingsnopower != -1) + CastingSnoPower = skillsno; + if (CastingSnoPower != -1) { - Attributes[GameAttribute.Buff_Icon_Start_Tick0, castingsnopower] = World.Game.TickCounter; - Attributes[GameAttribute.Buff_Icon_End_Tick0, castingsnopower] = World.Game.TickCounter + durationTicks; - Attributes[GameAttribute.Buff_Icon_Count0, castingsnopower] = 1; - Attributes[GameAttribute.Power_Buff_0_Visual_Effect_None, castingsnopower] = true; + Attributes[GameAttribute.Buff_Icon_Start_Tick0, CastingSnoPower] = World.Game.TickCounter; + Attributes[GameAttribute.Buff_Icon_End_Tick0, CastingSnoPower] = World.Game.TickCounter + durationTicks; + Attributes[GameAttribute.Buff_Icon_Count0, CastingSnoPower] = 1; + Attributes[GameAttribute.Power_Buff_0_Visual_Effect_None, CastingSnoPower] = true; } Attributes.BroadcastChangedIfRevealed(); @@ -4743,12 +4704,12 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem IsCasting = false; Attributes[GameAttribute.Looping_Animation_Start_Time] = -1; Attributes[GameAttribute.Looping_Animation_End_Time] = -1; - if (castingsnopower != -1) + if (CastingSnoPower != -1) { - Attributes[GameAttribute.Buff_Icon_Start_Tick0, castingsnopower] = -1; - Attributes[GameAttribute.Buff_Icon_End_Tick0, castingsnopower] = -1; - Attributes[GameAttribute.Buff_Icon_Count0, castingsnopower] = 0; - Attributes[GameAttribute.Power_Buff_0_Visual_Effect_None, castingsnopower] = false; + Attributes[GameAttribute.Buff_Icon_Start_Tick0, CastingSnoPower] = -1; + Attributes[GameAttribute.Buff_Icon_End_Tick0, CastingSnoPower] = -1; + Attributes[GameAttribute.Buff_Icon_Count0, CastingSnoPower] = 0; + Attributes[GameAttribute.Power_Buff_0_Visual_Effect_None, CastingSnoPower] = false; } Attributes.BroadcastChangedIfRevealed(); } @@ -4777,21 +4738,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem #region generic properties - public int ClassSNO - { - get - { - - if (Toon.Gender == 0) - { - return Toon.HeroTable.SNOMaleActor; - } - else - { - return Toon.HeroTable.SNOFemaleActor; - } - } - } + public int ClassSNO => Toon.Gender == 0 ? Toon.HeroTable.SNOMaleActor : Toon.HeroTable.SNOFemaleActor; public int AdditionalLootItems { @@ -4805,50 +4752,28 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem } } - public float ModelScale - { - get + public float ModelScale => + Toon.Class switch { - switch (Toon.Class) - { - case ToonClass.Barbarian: - return 1.2f; - case ToonClass.Crusader: - return 1.2f; - case ToonClass.DemonHunter: - return 1.35f; - case ToonClass.Monk: - return 1.43f; - case ToonClass.WitchDoctor: - return 1.1f; - case ToonClass.Wizard: - return 1.3f; - } - return 1.43f; - } - } + ToonClass.Barbarian => 1.2f, + ToonClass.Crusader => 1.2f, + ToonClass.DemonHunter => 1.35f, + ToonClass.Monk => 1.43f, + ToonClass.WitchDoctor => 1.1f, + ToonClass.Wizard => 1.3f, + _ => 1.43f + }; - public int PrimaryResourceID - { - get - { - return (int)Toon.HeroTable.PrimaryResource; - } - } + public int PrimaryResourceID => (int)Toon.HeroTable.PrimaryResource; - public int SecondaryResourceID - { - get - { - return (int)Toon.HeroTable.SecondaryResource; - } - } + public int SecondaryResourceID => (int)Toon.HeroTable.SecondaryResource; + [Obsolete] public bool IsInTown { get { - var town_areas = new List { 19947, 168314, 92945, 197101 }; + var townAreas = new List { 19947, 168314, 92945, 197101 }; var proximity = new RectangleF(Position.X - 1f, Position.Y - 1f, 2f, 2f); var scenes = World.QuadTree.Query(proximity); if (scenes.Count == 0) return false; @@ -4861,7 +4786,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem scene = scenes[1]; } - return town_areas.Contains(scene.Specification.SNOLevelAreas[0]); + return townAreas.Contains(scene.Specification.SNOLevelAreas[0]); } } @@ -5084,7 +5009,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem { SyncedData = new GameSyncedData { - GameSyncedFlags = InGameClient.Game.IsSeasoned == true ? InGameClient.Game.IsHardcore == true ? 3 : 2 : InGameClient.Game.IsHardcore == true ? 1 : 0, + GameSyncedFlags = InGameClient.Game.IsSeasoned ? InGameClient.Game.IsHardcore ? 3 : 2 : InGameClient.Game.IsHardcore ? 1 : 0, Act = Math.Min(InGameClient.Game.CurrentAct, 3000), //act id InitialMonsterLevel = InGameClient.Game.InitialMonsterLevel, //InitialMonsterLevel MonsterLevel = 0x64E4425E, //MonsterLevel @@ -5159,34 +5084,19 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem switch (Level) { case 10: - if (World.Game.IsHardcore) - GrantAchievement(74987243307034); - else - GrantAchievement(74987243307105); + GrantAchievement(World.Game.IsHardcore ? (ulong)74987243307034 : (ulong)74987243307105); break; case 20: - if (World.Game.IsHardcore) - GrantAchievement(74987243307035); - else - GrantAchievement(74987243307104); + GrantAchievement(World.Game.IsHardcore ? (ulong)74987243307035 : (ulong)74987243307104); break; case 30: - if (World.Game.IsHardcore) - GrantAchievement(74987243307036); - else - GrantAchievement(74987243307103); + GrantAchievement(World.Game.IsHardcore ? (ulong)74987243307036 : (ulong)74987243307103); break; case 40: - if (World.Game.IsHardcore) - GrantAchievement(74987243307037); - else - GrantAchievement(74987243307102); + GrantAchievement(World.Game.IsHardcore ? (ulong)74987243307037 : (ulong)74987243307102); break; case 50: - if (World.Game.IsHardcore) - GrantAchievement(74987243307038); - else - GrantAchievement(74987243307101); + GrantAchievement(World.Game.IsHardcore ? (ulong)74987243307038 : (ulong)74987243307101); if (World.Game.IsSeasoned) GrantCriteria(74987250038929); break; @@ -5226,7 +5136,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem #region gold, heath-glob collection public void VacuumPickupHealthOrb(float radius = -1) { - if (radius == -1) + if (Math.Abs(radius - (-1)) < 0.001) radius = Attributes[GameAttribute.Gold_PickUp_Radius]; var itemList = GetItemsInRange(radius); foreach (Item item in itemList) @@ -5406,7 +5316,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem else if (item.ItemDefinition.Name == "p1_normal_rifts_Orb" || item.ItemDefinition.Name == "p1_tiered_rifts_Orb") { - if (InGameClient.Game.ActiveNephalemTimer == true && InGameClient.Game.ActiveNephalemKilledMobs == false) + if (InGameClient.Game.ActiveNephalemTimer && InGameClient.Game.ActiveNephalemKilledMobs == false) { InGameClient.Game.ActiveNephalemProgress += 15f; foreach (var plr in InGameClient.Game.Players.Values) @@ -5573,7 +5483,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem AddHP(quantity, GuidingLight); } - public override void AddHP(float quantity, bool GuidingLight = false) + public override void AddHP(float quantity, bool guidingLight = false) { if (Dead) return; if (quantity == 0) return; @@ -5585,7 +5495,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PlayerSystem if (SkillSet.HasPassive(205217)) quantity += 0.01f * Attributes[GameAttribute.Health_Globe_Bonus_Health]; - if (GuidingLight) //Monk -> Guiding Light + if (guidingLight) //Monk -> Guiding Light { float missingHP = (Attributes[GameAttribute.Hitpoints_Max_Total] - Attributes[GameAttribute.Hitpoints_Cur]) / Attributes[GameAttribute.Hitpoints_Max_Total]; if (missingHP > 0.05f) diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs index 6eb5133..a5b0681 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/PowerSystem/Payloads/DeathPayload.cs @@ -405,7 +405,7 @@ namespace DiIiS_NA.GameServer.GSSystem.PowerSystem.Payloads { grantedExp = (int)(grantedExp * plr.World.Game.XPModifier); - float tempEXP = grantedExp * Config.Instance.RateEXP; + float tempEXP = grantedExp * Config.Instance.RateExp; plr.UpdateExp(Math.Max((int)tempEXP, 1)); var a = (int)plr.Attributes[GameAttribute.Experience_Bonus]; diff --git a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs index 71b5dc9..33507fc 100644 --- a/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs +++ b/src/DiIiS-NA/D3-GameServer/GSSystem/QuestSystem/Events.cs @@ -862,7 +862,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem cache.Attributes[GameAttribute.Item_Quality_Level] = Game.Difficulty; cache.Attributes[GameAttribute.IsCrafted] = true; plr.Inventory.PickUp(cache); - if(plr.Toon.isSeassoned) plr.GrantCriteria(74987258781748); + if(plr.Toon.IsSeasoned) plr.GrantCriteria(74987258781748); } }) }); @@ -906,7 +906,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem cache.Attributes[GameAttribute.Item_Quality_Level] = Game.Difficulty; cache.Attributes[GameAttribute.IsCrafted] = true; plr.Inventory.PickUp(cache); - if (plr.Toon.isSeassoned) plr.GrantCriteria(74987247833299); + if (plr.Toon.IsSeasoned) plr.GrantCriteria(74987247833299); } }) }); @@ -951,7 +951,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem cache.Attributes[GameAttribute.IsCrafted] = true; plr.Inventory.PickUp(cache); - if (plr.Toon.isSeassoned) plr.GrantCriteria(74987248811185); + if (plr.Toon.IsSeasoned) plr.GrantCriteria(74987248811185); } }) }); @@ -995,7 +995,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem cache.Attributes[GameAttribute.Item_Quality_Level] = Game.Difficulty; cache.Attributes[GameAttribute.IsCrafted] = true; plr.Inventory.PickUp(cache); - if (plr.Toon.isSeassoned) plr.GrantCriteria(74987256262166); + if (plr.Toon.IsSeasoned) plr.GrantCriteria(74987256262166); } }) }); @@ -1039,7 +1039,7 @@ namespace DiIiS_NA.GameServer.GSSystem.QuestSystem cache.Attributes[GameAttribute.Item_Quality_Level] = Game.Difficulty; cache.Attributes[GameAttribute.IsCrafted] = true; plr.Inventory.PickUp(cache); - if (plr.Toon.isSeassoned) plr.GrantCriteria(74987249495955); + if (plr.Toon.IsSeasoned) plr.GrantCriteria(74987249495955); } }) }); diff --git a/src/DiIiS-NA/Program.cs b/src/DiIiS-NA/Program.cs index dc7c0ea..ba314e3 100644 --- a/src/DiIiS-NA/Program.cs +++ b/src/DiIiS-NA/Program.cs @@ -81,7 +81,7 @@ namespace DiIiS_NA AnsiConsole.Write(new Rule($"[dodgerblue3]Build [/][deepskyblue3]{Build}[/]").RightJustified().RuleStyle("steelblue1_1")); AnsiConsole.Write(new Rule($"[dodgerblue3]Stage [/][deepskyblue3]{Stage}[/]").RightJustified().RuleStyle("steelblue1_1")); AnsiConsole.Write(new Rule($"[deepskyblue3]{TypeBuild}[/]").RightJustified().RuleStyle("steelblue1_1")); - AnsiConsole.Write(new Rule($"[red3_1]Diablo III[/] [red]RoS 2.7.4.84161[/] - [link=https://github.com/blizzless/blizzless-diiis]https://github.com/blizzless/blizzless-diiis[/]").RuleStyle("red")); + AnsiConsole.Write(new Rule($"Diablo III [red]RoS 2.7.4.84161[/] - [link=https://github.com/blizzless/blizzless-diiis]https://github.com/blizzless/blizzless-diiis[/]").RuleStyle("red")); AnsiConsole.MarkupLine(""); Console.WriteLine();