Added !info and !followers <dismiss> commands

Improved commands;
Lowered more logger outputs from Info/Trace to Debug.
This commit is contained in:
Lucca Faria Ferri 2023-01-26 17:29:14 -08:00
parent 54f135eac1
commit 9ef1ec0a6a
5 changed files with 194 additions and 125 deletions

View File

@ -1495,17 +1495,17 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
{ {
CurrentActivity = (int)field.Value.IntValue; CurrentActivity = (int)field.Value.IntValue;
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
Logger.Trace("{0} set CurrentActivity to {1}", this, field.Value.IntValue); Logger.Debug("{0} set CurrentActivity to {1}", this, field.Value.IntValue);
} }
else if (field.Key.Group == 2 && field.Key.Field == 4) //Unknown bool else if (field.Key.Group == 2 && field.Key.Field == 4) //Unknown bool
{ {
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
Logger.Trace("{0} set CurrentActivity to {1}", this, field.Value.BoolValue); Logger.Debug("{0} set CurrentActivity to {1}", this, field.Value.BoolValue);
} }
else if (field.Key.Group == 2 && field.Key.Field == 6) //Flags else if (field.Key.Group == 2 && field.Key.Field == 6) //Flags
{ {
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
Logger.Trace("{0} set Flags to {1}", this, field.Value.UintValue); Logger.Debug("{0} set Flags to {1}", this, field.Value.UintValue);
} }
else if (field.Key.Group == 2 && field.Key.Field == 8) //? else if (field.Key.Group == 2 && field.Key.Field == 8) //?
{ {
@ -1514,7 +1514,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
else if (field.Key.Group == 2 && field.Key.Field == 11) //Version else if (field.Key.Group == 2 && field.Key.Field == 11) //Version
{ {
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
Logger.Trace("{0} set Version to {1}", this, field.Value.StringValue); Logger.Debug("{0} set Version to {1}", this, field.Value.StringValue);
} }
else if (field.Key.Group == 4 && field.Key.Field == 1) //PartyId else if (field.Key.Group == 4 && field.Key.Field == 1) //PartyId
{ {
@ -1532,7 +1532,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
Logger.Trace("{0} set channel to {1}", this, channel); Logger.Debug("{0} set channel to {1}", this, channel);
} }
else else
{ {
@ -1541,7 +1541,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
// returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build()); // returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(PartyChannelId.ToByteString()).Build());
//else //else
returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(ByteString.Empty).Build()); returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(ByteString.Empty).Build());
Logger.Trace("Emtpy-field: {0}, {1}, {2}", field.Key.Program, field.Key.Group, field.Key.Field); 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 else if (field.Key.Group == 4 && field.Key.Field == 2) //JoinPermission
@ -1549,13 +1549,13 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
if (ScreenStatus.Screen != field.Value.IntValue) if (ScreenStatus.Screen != field.Value.IntValue)
{ {
ScreenStatus = ScreenStatus.CreateBuilder().SetScreen((int)field.Value.IntValue).SetStatus(0).Build(); ScreenStatus = ScreenStatus.CreateBuilder().SetScreen((int)field.Value.IntValue).SetStatus(0).Build();
Logger.Trace("{0} set current screen to {1}.", this, field.Value.IntValue); Logger.Debug("{0} set current screen to {1}.", this, field.Value.IntValue);
} }
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
} }
else if (field.Key.Group == 4 && field.Key.Field == 3) //CallToArmsMessage else if (field.Key.Group == 4 && field.Key.Field == 3) //CallToArmsMessage
{ {
Logger.Trace("CallToArmsMessage: {0}, {1}, {2}", field.Key.Group, field.Key.Field, field.Value); Logger.Debug("CallToArmsMessage: {0}, {1}, {2}", field.Key.Group, field.Key.Field, field.Value);
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
} }
else if (field.Key.Group == 4 && field.Key.Field == 4) //Party IsFull else if (field.Key.Group == 4 && field.Key.Field == 4) //Party IsFull
@ -1566,7 +1566,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
{ {
//returnField.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build()); //returnField.SetValue(Variant.CreateBuilder().SetBoolValue(false).Build());
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
Logger.Trace("{0} set Game IsPrivate {1}.", this, field.Value.ToString()); Logger.Debug("{0} set Game IsPrivate {1}.", this, field.Value.ToString());
} }
else else
{ {
@ -1579,7 +1579,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
{ {
AwayStatus = (AwayStatusFlag)field.Value.IntValue; AwayStatus = (AwayStatusFlag)field.Value.IntValue;
returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build()); returnField.SetValue(bgs.protocol.Variant.CreateBuilder().SetIntValue((long)AwayStatus).Build());
Logger.Trace("{0} set AwayStatus to {1}.", this, AwayStatus); Logger.Debug("{0} set AwayStatus to {1}.", this, AwayStatus);
} }
else if (field.Key.Group == 2 && field.Key.Field == 8)// RichPresence else if (field.Key.Group == 2 && field.Key.Field == 8)// RichPresence
{ {
@ -1588,7 +1588,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
else if (field.Key.Group == 2 && field.Key.Field == 10) // AFK else if (field.Key.Group == 2 && field.Key.Field == 10) // AFK
{ {
returnField.SetValue(field.Value); returnField.SetValue(field.Value);
Logger.Trace("{0} set AFK to {1}.", this, field.Value.BoolValue); Logger.Debug("{0} set AFK to {1}.", this, field.Value.BoolValue);
} }
else else
{ {
@ -1740,7 +1740,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
public override string ToString() public override string ToString()
{ {
return String.Format("{{ GameAccount: {0} [lowId: {1}] }}", Owner.BattleTag, BnetEntityId.Low); 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 //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

View File

@ -1,4 +1,4 @@
#define LOG_KEEP_ALIVE //#define LOG_KEEP_ALIVE
//Blizzless Project 2022 //Blizzless Project 2022
using bgs.protocol; using bgs.protocol;

View File

@ -189,7 +189,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
{ {
// TODO: Find a game that fits the clients params and join /raist. // TODO: Find a game that fits the clients params and join /raist.
var publicGameParams = D3.PartyMessage.SearchForPublicGameParams.ParseFrom(attribute.Value.MessageValue); var publicGameParams = D3.PartyMessage.SearchForPublicGameParams.ParseFrom(attribute.Value.MessageValue);
Logger.Trace("SearchForPublicGameParams: {0}", publicGameParams.ToString()); Logger.Debug("SearchForPublicGameParams: {0}", publicGameParams.ToString());
var attr = bgs.protocol.Attribute.CreateBuilder() var attr = bgs.protocol.Attribute.CreateBuilder()
.SetName("D3.Party.SearchForPublicGame.Params") .SetName("D3.Party.SearchForPublicGame.Params")
.SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(publicGameParams.ToByteString()).Build()); .SetValue(bgs.protocol.Variant.CreateBuilder().SetMessageValue(publicGameParams.ToByteString()).Build());

View File

@ -221,7 +221,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
#if DEBUG #if DEBUG
if (messageId != 270) if (messageId != 270)
Logger.Info("ProcessClientRequest() ID: {0}", messageId); Logger.Debug("ProcessClientRequest() ID: {0}", messageId);
#endif #endif
switch (((HandlerController)controller).Client.Account.GameAccount.ProgramField.Value) switch (((HandlerController)controller).Client.Account.GameAccount.ProgramField.Value)
{ {
@ -243,9 +243,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
ByteString hero1 = OnHeroDeleteParams(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); ByteString hero1 = OnHeroDeleteParams(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue);
attr.SetValue(Variant.CreateBuilder().SetMessageValue(hero1)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(hero1));
break; break;
case 3: // Выбор Персонажа case 3: // Hero Select
ByteString SwitchHero = SwitchCharRequest(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue); ByteString switchHero = SwitchCharRequest(((HandlerController)controller).Client, request.GetAttribute(2).Value.MessageValue);
attr.SetValue(Variant.CreateBuilder().SetMessageValue(SwitchHero)); attr.SetValue(Variant.CreateBuilder().SetMessageValue(switchHero));
break; break;
case 4: //D3.GameMessages.SaveBannerConfiguration -> return MessageId with no Message 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);
@ -497,20 +497,20 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
{ {
var request = D3.GameMessage.LeaderboardGetHeroSnapshot.ParseFrom(data); var request = D3.GameMessage.LeaderboardGetHeroSnapshot.ParseFrom(data);
var response = D3.GameMessage.LeaderboardGetHeroSnapshotResponse.CreateBuilder(); var response = D3.GameMessage.LeaderboardGetHeroSnapshotResponse.CreateBuilder();
bool Season = false; bool season = false;
bool Hardcore = false; bool hardcore = false;
ToonClass NeededClass = 0; ToonClass neededClass = 0;
switch (request.LeaderboardId) switch (request.LeaderboardId)
{ {
case 1: case 1:
break; break;
case 2: NeededClass = ToonClass.Barbarian; break; // Barbarian case 2: neededClass = ToonClass.Barbarian; break; // Barbarian
case 3: NeededClass = ToonClass.Crusader; break; // Crusader case 3: neededClass = ToonClass.Crusader; break; // Crusader
case 4: NeededClass = ToonClass.DemonHunter; break; // Demon Hunter case 4: neededClass = ToonClass.DemonHunter; break; // Demon Hunter
case 5: NeededClass = ToonClass.Monk; break; // Monk case 5: neededClass = ToonClass.Monk; break; // Monk
case 6: NeededClass = ToonClass.WitchDoctor; break; // Witch Doctor case 6: neededClass = ToonClass.WitchDoctor; break; // Witch Doctor
case 7: NeededClass = ToonClass.Wizard; break; // Wizard case 7: neededClass = ToonClass.Wizard; break; // Wizard
case 8: NeededClass = ToonClass.Necromancer; break; // Necromancer case 8: neededClass = ToonClass.Necromancer; break; // Necromancer
case 10: // deuces case 10: // deuces
break; break;
@ -532,48 +532,48 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
switch (request.ScopeId) switch (request.ScopeId)
{ {
case 3: break; //Normal case 3: break; //Normal
case 2: Hardcore = true; break; //Hardcore case 2: hardcore = true; break; //Hardcore
case 5: Season = true; break; //Seasonal case 5: season = true; break; //Seasonal
case 4: Season = true; Hardcore = true; break; //Hardcore and Seasonal case 4: season = true; hardcore = true; break; //Hardcore and Seasonal
} }
List<DBGameAccount> GA = DBSessions.SessionQuery<DBGameAccount>().Where(a => a.Id == request.GameAccountId).ToList(); List<DBGameAccount> gameAccounts = DBSessions.SessionQuery<DBGameAccount>().Where(a => a.Id == request.GameAccountId).ToList();
var Heroes = ToonManager.GetToonsForGameAccount(GameAccountManager.GetGameAccountByDBGameAccount(GA[0])); var heroes = ToonManager.GetToonsForGameAccount(GameAccountManager.GetGameAccountByDBGameAccount(gameAccounts[0]));
Toon Hero = null; Toon hero = null;
byte upLevel = 0; byte upLevel = 0;
int idx = -1; int idx = -1;
if (Heroes.Count > 0) if (heroes.Count > 0)
{ {
for (int i = 0; i < Heroes.Count; i++) for (int i = 0; i < heroes.Count; i++)
{ {
if (Season && !Heroes[i].isSeassoned) continue; if (season && !heroes[i].isSeassoned) continue;
if (Hardcore && !Heroes[i].IsHardcore) continue; if (hardcore && !heroes[i].IsHardcore) continue;
if (Heroes[i].Class != NeededClass && (uint)NeededClass != 0) continue; if (heroes[i].Class != neededClass && (uint)neededClass != 0) continue;
if (upLevel > Heroes[i].Level) continue; if (upLevel > heroes[i].Level) continue;
upLevel = Heroes[i].Level; upLevel = heroes[i].Level;
idx = i; idx = i;
} }
if (idx > -1) if (idx > -1)
Hero = Heroes[idx]; hero = heroes[idx];
} }
if (Hero != null) if (hero != null)
{ {
var Snapshot = D3.Leaderboard.HeroSnapshot.CreateBuilder() var Snapshot = D3.Leaderboard.HeroSnapshot.CreateBuilder()
.SetHeroId(Hero.D3EntityID) .SetHeroId(hero.D3EntityID)
.AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(1).SetGbid(Hero.Cosmetic1)) .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(2).SetGbid(hero.Cosmetic2))
.AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(3).SetGbid(Hero.Cosmetic3)) .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(3).SetGbid(hero.Cosmetic3))
.AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(4).SetGbid(Hero.Cosmetic4)) .AddCosmeticItems(D3.Leaderboard.HeroCosmeticItem.CreateBuilder().SetCosmeticVisualInventorySlot(4).SetGbid(hero.Cosmetic4))
.SetActiveSkills(SkillsWithRunes.CreateBuilder() .SetActiveSkills(SkillsWithRunes.CreateBuilder()
.AddRunes(SkillWithRune.CreateBuilder().SetSkill(Hero.DBActiveSkills.Skill0).SetRuneType(Hero.DBActiveSkills.Rune0)) .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.Skill1).SetRuneType(hero.DBActiveSkills.Rune1))
.AddRunes(SkillWithRune.CreateBuilder().SetSkill(Hero.DBActiveSkills.Skill2).SetRuneType(Hero.DBActiveSkills.Rune2)) .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.Skill3).SetRuneType(hero.DBActiveSkills.Rune3))
.AddRunes(SkillWithRune.CreateBuilder().SetSkill(Hero.DBActiveSkills.Skill4).SetRuneType(Hero.DBActiveSkills.Rune4)) .AddRunes(SkillWithRune.CreateBuilder().SetSkill(hero.DBActiveSkills.Skill4).SetRuneType(hero.DBActiveSkills.Rune4))
.AddRunes(SkillWithRune.CreateBuilder().SetSkill(Hero.DBActiveSkills.Skill5).SetRuneType(Hero.DBActiveSkills.Rune5))) .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)); .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) foreach (var item in hero.Profile.Equipment.ItemsList)
{ {
int pos = 0; int pos = 0;
switch ((item.ItemSlot - 272) / 16) switch ((item.ItemSlot - 272) / 16)
@ -611,18 +611,18 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
var response = LeaderboardFetchScoresResponse.CreateBuilder(); var response = LeaderboardFetchScoresResponse.CreateBuilder();
bool season = false; bool season = false;
bool hardcore = false; bool hardcore = false;
ToonClass NeededClass = ToonClass.Unknown; ToonClass neededClass = ToonClass.Unknown;
switch (request.LeaderboardId) switch (request.LeaderboardId)
{ {
case 1: case 1:
break; break;
case 2: NeededClass = ToonClass.Barbarian; break; // Barbarian. case 2: neededClass = ToonClass.Barbarian; break; // Barbarian.
case 3: NeededClass = ToonClass.Crusader; break; // Crusader. case 3: neededClass = ToonClass.Crusader; break; // Crusader.
case 4: NeededClass = ToonClass.DemonHunter; break; // Demon Hunter. case 4: neededClass = ToonClass.DemonHunter; break; // Demon Hunter.
case 5: NeededClass = ToonClass.Monk; break; // Monk. case 5: neededClass = ToonClass.Monk; break; // Monk.
case 6: NeededClass = ToonClass.WitchDoctor; break; // Warlock. case 6: neededClass = ToonClass.WitchDoctor; break; // Warlock.
case 7: NeededClass = ToonClass.Wizard; break; // Wizard. case 7: neededClass = ToonClass.Wizard; break; // Wizard.
case 8: NeededClass = ToonClass.Necromancer; break; // Necromancer. case 8: neededClass = ToonClass.Necromancer; break; // Necromancer.
case 10: // ToonClass. case 10: // ToonClass.
break; break;
@ -665,7 +665,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
{ {
if (season && !Heroes[i].isSeassoned) continue; if (season && !Heroes[i].isSeassoned) continue;
if (hardcore && !Heroes[i].IsHardcore) 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; if (upLevel > Heroes[i].Level) continue;
upLevel = Heroes[i].Level; upLevel = Heroes[i].Level;
idx = i; idx = i;
@ -676,27 +676,27 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
if (Hero != null) if (Hero != null)
try try
{ {
GameAccount Gaccount = GameAccountManager.GetGameAccountByDBGameAccount(gameAccount); GameAccount gameAccount2 = GameAccountManager.GetGameAccountByDBGameAccount(gameAccount);
Account account = AccountManager.GetAccountByPersistentID(Gaccount.AccountId); Account account = AccountManager.GetAccountByPersistentID(gameAccount2.AccountId);
var Memb = D3.Leaderboard.Member.CreateBuilder() var member = D3.Leaderboard.Member.CreateBuilder()
.SetAccountId(Gaccount.AccountId) .SetAccountId(gameAccount2.AccountId)
.SetHeroSeasonCreated((uint)Hero.SeasonCreated) .SetHeroSeasonCreated((uint)Hero.SeasonCreated)
.SetBattleTag(account.BattleTagName) .SetBattleTag(account.BattleTagName)
.SetHeroAltLevel((uint)Gaccount.DBGameAccount.ParagonLevel) .SetHeroAltLevel((uint)gameAccount2.DBGameAccount.ParagonLevel)
.SetHeroFlags((uint)Hero.Flags) .SetHeroFlags((uint)Hero.Flags)
.SetHeroLevel((uint)Hero.Level) .SetHeroLevel((uint)Hero.Level)
.SetHeroGbidClass((uint)Hero.ClassID) .SetHeroGbidClass((uint)Hero.ClassID)
.SetHeroName(Hero.Name) .SetHeroName(Hero.Name)
.SetHeroSnapshotAvailable(true) .SetHeroSnapshotAvailable(true)
.SetHeroVisualEquipment(Gaccount.Toons[0].Digest.VisualEquipment); .SetHeroVisualEquipment(gameAccount2.Toons[0].Digest.VisualEquipment);
if (Gaccount.Clan != null) if (gameAccount2.Clan != null)
{ {
Memb.SetClanId(Gaccount.Clan.GuildId.GuildId_).SetClanTag(Gaccount.Clan.Prefix).SetClanName(Gaccount.Clan.Name); member.SetClanId(gameAccount2.Clan.GuildId.GuildId_).SetClanTag(gameAccount2.Clan.Prefix).SetClanName(gameAccount2.Clan.Name);
} }
response response
.AddEntry(D3.Leaderboard.Score.CreateBuilder() .AddEntry(D3.Leaderboard.Score.CreateBuilder()
.SetGameAccountId(Gaccount.AccountId) .SetGameAccountId(gameAccount2.AccountId)
.SetScore_((ulong)Hero.Level + (ushort)Gaccount.DBGameAccount.ParagonLevel) // Temporary Separation. .SetScore_((ulong)Hero.Level + (ushort)gameAccount2.DBGameAccount.ParagonLevel) // Temporary Separation.
.SetScoreBand(5) .SetScoreBand(5)
.SetLeaderboardId(5) .SetLeaderboardId(5)
.SetScopeId(5) .SetScopeId(5)
@ -709,15 +709,15 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
.SetAct5TimeMs(0) .SetAct5TimeMs(0)
.SetLevelSeed(0) .SetLevelSeed(0)
.SetCheated(false) .SetCheated(false)
.AddTeamMember(Memb) .AddTeamMember(member)
.SetChallengeData(D3.Leaderboard.WeeklyChallengeData.CreateBuilder() .SetChallengeData(D3.Leaderboard.WeeklyChallengeData.CreateBuilder()
.SetBnetAccountId(unchecked((uint)account.BnetEntityId.Low)) .SetBnetAccountId(unchecked((uint)account.BnetEntityId.Low))
.SetGameAccountId(GameAccountHandle.CreateBuilder().SetId(unchecked((uint)Gaccount.BnetEntityId.Low)).SetProgram(17459).SetRegion(1)) .SetGameAccountId(GameAccountHandle.CreateBuilder().SetId(unchecked((uint)gameAccount2.BnetEntityId.Low)).SetProgram(17459).SetRegion(1))
.SetHeroSnapshot(D3.Hero.SavedDefinition.CreateBuilder().SetVersion(905) .SetHeroSnapshot(D3.Hero.SavedDefinition.CreateBuilder().SetVersion(905)
.SetDigest(Hero.Digest) .SetDigest(Hero.Digest)
.SetSavedAttributes(D3.AttributeSerializer.SavedAttributes.CreateBuilder())) .SetSavedAttributes(D3.AttributeSerializer.SavedAttributes.CreateBuilder()))
.SetAccountSnapshot(D3.Account.SavedDefinition.CreateBuilder().SetVersion(905) .SetAccountSnapshot(D3.Account.SavedDefinition.CreateBuilder().SetVersion(905)
.SetDigest(Gaccount.Digest)) .SetDigest(gameAccount2.Digest))
.SetRiftSnapshot(D3.Leaderboard.RiftSnapshot.CreateBuilder() .SetRiftSnapshot(D3.Leaderboard.RiftSnapshot.CreateBuilder()
.SetRiftSeed(2342341) .SetRiftSeed(2342341)
.SetRiftTier(1) .SetRiftTier(1)
@ -729,8 +729,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
} }
catch catch (Exception ex)
{ {
Logger.ErrorException(ex, "Error while creating leaderboard entry");
} }
} }
return response.Build().ToByteString(); return response.Build().ToByteString();
@ -738,20 +739,20 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
private ByteString GetRating(BattleClient client, ByteString data) private ByteString GetRating(BattleClient client, ByteString data)
{ {
LeaderboardList request = LeaderboardList.ParseFrom(data); LeaderboardList request = LeaderboardList.ParseFrom(data);
bool Season = false; bool season = false;
bool Hardcore = false; bool hardcore = false;
ToonClass NeededClass = ToonClass.Unknown; ToonClass neededClass = ToonClass.Unknown;
switch (request.LeaderboardId) switch (request.LeaderboardId)
{ {
case 1: case 1:
break; break;
case 2: NeededClass = ToonClass.Barbarian; break; // Barbarian case 2: neededClass = ToonClass.Barbarian; break; // Barbarian
case 3: NeededClass = ToonClass.Crusader; break; // Crusader case 3: neededClass = ToonClass.Crusader; break; // Crusader
case 4: NeededClass = ToonClass.DemonHunter; break; // Demon Hunter case 4: neededClass = ToonClass.DemonHunter; break; // Demon Hunter
case 5: NeededClass = ToonClass.Monk; break; // Monk case 5: neededClass = ToonClass.Monk; break; // Monk
case 6: NeededClass = ToonClass.WitchDoctor; break; // Witch Doctor case 6: neededClass = ToonClass.WitchDoctor; break; // Witch Doctor
case 7: NeededClass = ToonClass.Wizard; break; // Wizard case 7: neededClass = ToonClass.Wizard; break; // Wizard
case 8: NeededClass = ToonClass.Necromancer; break; // Necromancer case 8: neededClass = ToonClass.Necromancer; break; // Necromancer
case 10: // Duples case 10: // Duples
break; break;
@ -769,9 +770,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
switch (request.ScopeId) switch (request.ScopeId)
{ {
case 3: break; //Normal case 3: break; //Normal
case 2: Hardcore = true; break; //Hardcore case 2: hardcore = true; break; //Hardcore
case 5: Season = true; break; //Seasonal case 5: season = true; break; //Seasonal
case 4: Season = true; Hardcore = true; break; //Seasonal + Harcore case 4: season = true; hardcore = true; break; //Seasonal + Harcore
} }
var result = LeaderboardListResponse.CreateBuilder() var result = LeaderboardListResponse.CreateBuilder()
@ -785,39 +786,39 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
{ {
var toons = ToonManager.GetToonsForGameAccount( var toons = ToonManager.GetToonsForGameAccount(
GameAccountManager.GetGameAccountByDBGameAccount(gameAccountId)); GameAccountManager.GetGameAccountByDBGameAccount(gameAccountId));
Toon Hero = null; Toon hero = null;
byte uplvl = 0; byte upLevel = 0;
int idx = -1; int idx = -1;
if (toons.Count > 0) if (toons.Count > 0)
{ {
for (int i = 0; i < toons.Count; i++) for (int i = 0; i < toons.Count; i++)
{ {
if (Season && !toons[i].isSeassoned) continue; if (season && !toons[i].isSeassoned) continue;
if (Hardcore && !toons[i].IsHardcore) continue; if (hardcore && !toons[i].IsHardcore) continue;
if (toons[i].Class != NeededClass && NeededClass != ToonClass.Unknown) continue; if (toons[i].Class != neededClass && neededClass != ToonClass.Unknown) continue;
if (uplvl > toons[i].Level) continue; if (upLevel > toons[i].Level) continue;
uplvl = toons[i].Level; upLevel = toons[i].Level;
idx = i; idx = i;
} }
if (idx > -1) if (idx > -1)
Hero = toons[idx]; hero = toons[idx];
} }
if (Hero != null) if (hero != null)
try try
{ {
GameAccount gameAccount = GameAccountManager.GetGameAccountByDBGameAccount(gameAccountId); GameAccount gameAccount = GameAccountManager.GetGameAccountByDBGameAccount(gameAccountId);
Account account = AccountManager.GetAccountByPersistentID(gameAccount.AccountId); Account account = AccountManager.GetAccountByPersistentID(gameAccount.AccountId);
var member = D3.Leaderboard.Member.CreateBuilder() var member = D3.Leaderboard.Member.CreateBuilder()
.SetAccountId((uint)gameAccount.D3GameAccountId.IdLow) .SetAccountId((uint)gameAccount.D3GameAccountId.IdLow)
.SetHeroSeasonCreated((uint)Hero.SeasonCreated) .SetHeroSeasonCreated((uint)hero.SeasonCreated)
.SetBattleTag(account.BattleTagName) .SetBattleTag(account.BattleTagName)
.SetHeroAltLevel((uint)gameAccount.DBGameAccount.ParagonLevel) .SetHeroAltLevel((uint)gameAccount.DBGameAccount.ParagonLevel)
.SetHeroFlags((uint)Hero.Flags) .SetHeroFlags((uint)hero.Flags)
.SetHeroLevel((uint)Hero.Level) .SetHeroLevel((uint)hero.Level)
.SetHeroGbidClass((uint)Hero.ClassID) .SetHeroGbidClass((uint)hero.ClassID)
.SetHeroName(Hero.Name) .SetHeroName(hero.Name)
.SetHeroSnapshotAvailable(true) .SetHeroSnapshotAvailable(true)
.SetHeroVisualEquipment(gameAccount.Toons[0].Digest.VisualEquipment); .SetHeroVisualEquipment(gameAccount.Toons[0].Digest.VisualEquipment);
if (gameAccount.Clan != null) if (gameAccount.Clan != null)
@ -830,7 +831,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
.AddEntry(D3.Leaderboard.Slot.CreateBuilder() .AddEntry(D3.Leaderboard.Slot.CreateBuilder()
.SetGameAccountId(gameAccount.AccountId) .SetGameAccountId(gameAccount.AccountId)
//TODO: Need to implement the calculation from the time of passage of the portal! //TODO: Need to implement the calculation from the time of passage of the portal!
.SetScore((ulong)Hero.Level + .SetScore((ulong)hero.Level +
(ulong)gameAccount.DBGameAccount.ParagonLevel) //temporary separation (ulong)gameAccount.DBGameAccount.ParagonLevel) //temporary separation
.SetTimestamp(DateTime.UtcNow.ToUnixTime()) .SetTimestamp(DateTime.UtcNow.ToUnixTime())
.SetMetadata(D3.Leaderboard.Metadata.CreateBuilder() .SetMetadata(D3.Leaderboard.Metadata.CreateBuilder()
@ -847,7 +848,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
.SetId(unchecked((uint)gameAccount.BnetEntityId.Low)).SetProgram(17459) .SetId(unchecked((uint)gameAccount.BnetEntityId.Low)).SetProgram(17459)
.SetRegion(1)) .SetRegion(1))
.SetHeroSnapshot(D3.Hero.SavedDefinition.CreateBuilder().SetVersion(905) .SetHeroSnapshot(D3.Hero.SavedDefinition.CreateBuilder().SetVersion(905)
.SetDigest(Hero.Digest) .SetDigest(hero.Digest)
.SetSavedAttributes(D3.AttributeSerializer.SavedAttributes.CreateBuilder())) .SetSavedAttributes(D3.AttributeSerializer.SavedAttributes.CreateBuilder()))
.SetAccountSnapshot(D3.Account.SavedDefinition.CreateBuilder().SetVersion(905) .SetAccountSnapshot(D3.Account.SavedDefinition.CreateBuilder().SetVersion(905)
.SetDigest(gameAccount.Digest) .SetDigest(gameAccount.Digest)
@ -908,8 +909,8 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
} }
private ByteString OnHeroDeleteParams(BattleClient client, ByteString data) private ByteString OnHeroDeleteParams(BattleClient client, ByteString data)
{ {
var DeleteParams = DeleteHero.ParseFrom(data); var deleteParams = DeleteHero.ParseFrom(data);
var toon = ToonManager.GetToonByLowID(DeleteParams.HeroId); var toon = ToonManager.GetToonByLowID(deleteParams.HeroId);
ToonManager.DeleteToon(toon); ToonManager.DeleteToon(toon);
return ByteString.Empty; return ByteString.Empty;
} }
@ -918,11 +919,11 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
var request = D3.GameMessage.GetToonSettings.ParseFrom(data); var request = D3.GameMessage.GetToonSettings.ParseFrom(data);
var oldToon = client.Account.GameAccount.CurrentToon; var oldToon = client.Account.GameAccount.CurrentToon;
var newtoon = ToonManager.GetToonByLowID(request.HeroId); var newToon = ToonManager.GetToonByLowID(request.HeroId);
if (oldToon != newtoon) if (oldToon != newToon)
{ {
client.Account.GameAccount.CurrentToon = newtoon; client.Account.GameAccount.CurrentToon = newToon;
client.Account.GameAccount.NotifyUpdate(); client.Account.GameAccount.NotifyUpdate();
//AccountManager.SaveToDB(Client.Account); //AccountManager.SaveToDB(Client.Account);
//Client.Account.GameAccount.Setted = true; //Client.Account.GameAccount.Setted = true;
@ -947,7 +948,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
#region Banner editing #region Banner editing
private bool SaveBanner(BattleClient client, ByteString data) private bool SaveBanner(BattleClient client, ByteString data)
{ {
Logger.Trace("SaveBannerConfiguration()"); Logger.Debug("SaveBannerConfiguration()");
//var bannerConfig = HeroDigestBanner.ParseFrom(data); //var bannerConfig = HeroDigestBanner.ParseFrom(data);
var bannerConfig = SaveBannerConfiguration.ParseFrom(data); var bannerConfig = SaveBannerConfiguration.ParseFrom(data);
@ -979,7 +980,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
private ByteString SearchGuilds(BattleClient client, ByteString data) private ByteString SearchGuilds(BattleClient client, ByteString data)
{ {
GuildSearch request = GuildSearch.ParseFrom(data); GuildSearch request = GuildSearch.ParseFrom(data);
Logger.Trace("GuildSearch(): {0}", request.ToString()); Logger.Debug("GuildSearch(): {0}", request.ToString());
var builder = D3.Guild.GuildSearchResultList.CreateBuilder(); var builder = D3.Guild.GuildSearchResultList.CreateBuilder();
List<Guild> allGuilds = request.ClanOrGroup == 1 ? GuildManager.GetCommunities() : GuildManager.GetClans(); List<Guild> allGuilds = request.ClanOrGroup == 1 ? GuildManager.GetCommunities() : GuildManager.GetClans();
@ -1053,7 +1054,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
} }
private void GuildKickMemberP(BattleClient client, D3.GameMessage.GuildKickMember request) private void GuildKickMemberP(BattleClient client, D3.GameMessage.GuildKickMember request)
{ {
Logger.Trace("GuildKickMember(): {0}", request.ToString()); Logger.Debug("GuildKickMember(): {0}", request.ToString());
var guild = GuildManager.GetGuildById(request.GuildId); var guild = GuildManager.GetGuildById(request.GuildId);
if (guild != null && client.Account.GameAccount.PersistentID == guild.Owner.PersistentID) if (guild != null && client.Account.GameAccount.PersistentID == guild.Owner.PersistentID)
@ -1065,7 +1066,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
} }
private void GuildDisband(BattleClient client, D3.GameMessage.GuildId request) private void GuildDisband(BattleClient client, D3.GameMessage.GuildId request)
{ {
Logger.Trace("GuildDisband(): {0}", request.ToString()); Logger.Debug("GuildDisband(): {0}", request.ToString());
var guild = GuildManager.GetGuildById(request.GuildId_); var guild = GuildManager.GetGuildById(request.GuildId_);
if (guild != null && client.Account.GameAccount.PersistentID == guild.Owner.PersistentID) if (guild != null && client.Account.GameAccount.PersistentID == guild.Owner.PersistentID)
@ -1080,7 +1081,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
} }
private ByteString GuildFetchNews(BattleClient client, D3.GameMessage.GuildFetchNews request) private ByteString GuildFetchNews(BattleClient client, D3.GameMessage.GuildFetchNews request)
{ {
Logger.Trace("GuildFetchNews(): {0}", request.ToString()); Logger.Debug("GuildFetchNews(): {0}", request.ToString());
var builder = D3.Guild.NewsList.CreateBuilder(); var builder = D3.Guild.NewsList.CreateBuilder();
/* news types: /* news types:
@ -1115,7 +1116,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
private ByteString GuildPromoteMember(BattleClient client, D3.GameMessage.GuildPromoteMember request) private ByteString GuildPromoteMember(BattleClient client, D3.GameMessage.GuildPromoteMember request)
{ {
Logger.Trace("GuildPromoteMember(): {0}", request.ToString()); Logger.Debug("GuildPromoteMember(): {0}", request.ToString());
var guild = GuildManager.GetGuildById(request.GuildId); var guild = GuildManager.GetGuildById(request.GuildId);
var account = GameAccountManager.GetAccountByPersistentID(request.MemberId); var account = GameAccountManager.GetAccountByPersistentID(request.MemberId);
@ -1136,7 +1137,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
private ByteString GuildDemoteMember(BattleClient client, D3.GameMessage.GuildDemoteMember request) private ByteString GuildDemoteMember(BattleClient client, D3.GameMessage.GuildDemoteMember request)
{ {
Logger.Trace("GuildDemoteMember(): {0}", request.ToString()); Logger.Debug("GuildDemoteMember(): {0}", request.ToString());
var guild = GuildManager.GetGuildById(request.GuildId); var guild = GuildManager.GetGuildById(request.GuildId);
var account = GameAccountManager.GetAccountByPersistentID(request.MemberId); var account = GameAccountManager.GetAccountByPersistentID(request.MemberId);
@ -1294,7 +1295,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
private ByteString CreateCommunity(BattleClient client, ByteString data) private ByteString CreateCommunity(BattleClient client, ByteString data)
{ {
var request = GroupCreate.ParseFrom(data); var request = GroupCreate.ParseFrom(data);
Logger.Trace("CreateCommunity(): {0}", request.ToString()); 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) if (guild != null)
@ -2300,14 +2301,12 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
} }
private ByteString SelectToon(BattleClient Client, ByteString data) private ByteString SelectToon(BattleClient Client, ByteString data)
{ {
var request = D3.GameMessage.HeroDigestListRequest.ParseFrom(data); var request = D3.GameMessage.HeroDigestListRequest.ParseFrom(data);
var builder = HeroDigestListResponse.CreateBuilder(); var builder = HeroDigestListResponse.CreateBuilder();
foreach (var toon in request.ToonIdList) foreach (var toon in request.ToonIdList)
builder.AddDigestList(ToonManager.GetToonByLowID(toon).Digest); builder.AddDigestList(ToonManager.GetToonByLowID(toon).Digest);
return builder.Build().ToByteString(); return builder.Build().ToByteString();
} }
private ByteString SendWarden3Custom(BattleClient client, ByteString data) private ByteString SendWarden3Custom(BattleClient client, ByteString data)
@ -3778,14 +3777,14 @@ challenge_end_time_unix_seconds: 1583200800
} }
private ByteString GetGameAccountSettings(BattleClient client) private ByteString GetGameAccountSettings(BattleClient client)
{ {
Logger.Trace("GetGameAccountSettings()"); Logger.Debug("GetGameAccountSettings()");
var gameAccount = client.Account.GameAccount; var gameAccount = client.Account.GameAccount;
return gameAccount.Settings.ToByteString(); return gameAccount.Settings.ToByteString();
} }
private ByteString SetGameAccountSettings(SetGameAccountSettings settings, BattleClient client) private ByteString SetGameAccountSettings(SetGameAccountSettings settings, BattleClient client)
{ {
Logger.Trace("SetGameAccountSettings()"); Logger.Debug("SetGameAccountSettings()");
client.Account.GameAccount.Settings = settings.Settings; client.Account.GameAccount.Settings = settings.Settings;
return ByteString.Empty; return ByteString.Empty;

View File

@ -37,13 +37,83 @@ using System.Linq;
using System.Text; using System.Text;
//Blizzless Project 2022 //Blizzless Project 2022
using System.Threading.Tasks; using System.Threading.Tasks;
using DiIiS_NA.GameServer.GSSystem.GameSystem;
using DiIiS_NA.GameServer.GSSystem.ObjectsSystem; using DiIiS_NA.GameServer.GSSystem.ObjectsSystem;
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
using DiIiS_NA.LoginServer.AccountsSystem; using DiIiS_NA.LoginServer.AccountsSystem;
//Blizzless Project 2022 //Blizzless Project 2022
using static DiIiS_NA.Core.MPQ.FileFormats.GameBalance; using static DiIiS_NA.Core.MPQ.FileFormats.GameBalance;
namespace DiIiS_NA.GameServer.CommandManager namespace DiIiS_NA.GameServer.CommandManager
{ {
[CommandGroup("info", "Get current game information.")]
public class InfoCommand : CommandGroup
{
[DefaultCommand]
public string Info(string[] @params, BattleClient invokerClient)
{
if (invokerClient?.InGameClient?.Game is not { } game || invokerClient.InGameClient.Player is not { } player || invokerClient.Account is not{} account)
return "You are not in game.";
return GetInfo(account, player, game);
}
private string GetInfo(Account account, Player player, Game game)
{
List<string> info = new()
{
$"Game: {game.GameId}",
$"Difficulty: {game.Difficulty}",
$"Worlds: {game.Worlds.Count}",
$"Players: {game.Players.Count}",
$"Monsters: {game.Worlds.Sum(w => w.Monsters.Count)}"
};
if (account.UserLevel >= Account.UserLevels.GM)
{
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}");
foreach (var playerInWorld in world.Players)
{
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(
$" Health: {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Cur]} / {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Max]}");
info.Add($" Damage: {playerInWorld.Value.Attributes[GameAttribute.Damage_Min, 0]}");
}
}
}
return string.Join('\n', info);
}
}
[CommandGroup("followers", "Manage your followers.", Account.UserLevels.Tester)]
public class FollowersCommand : CommandGroup
{
[Command("dismiss", "Dismisses all followers.")]
public string DismissAllCommand(string[] @params, BattleClient invokerClient)
{
if (invokerClient?.InGameClient?.Player is not {} player)
return "You are not in game.";
var followers = player.Followers.ToArray();
// destroy followers
foreach (var follower in followers)
{
player.DestroyFollower(follower.Value);
}
return $"Dismissed {followers.Length} followers.";
}
}
[CommandGroup("difficulty", "Changes difficulty of the game", Account.UserLevels.GM)] [CommandGroup("difficulty", "Changes difficulty of the game", Account.UserLevels.GM)]
public class DifficultyCommand : CommandGroup public class DifficultyCommand : CommandGroup