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.

This commit is contained in:
Lucca Faria Ferri 2023-01-28 04:39:28 -08:00
parent 0ba94f6147
commit b66569abbd
36 changed files with 3919 additions and 3328 deletions

View File

@ -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<ulong> FriendsIds = new List<ulong>();
public List<ulong> FriendsIds = new();
public List<ulong> IgnoreIds = new List<ulong>();
public List<ulong> 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,40 +134,40 @@ 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
{
lock (DBAccount)
{
DBAccount.PasswordVerifier = value;
DBSessions.SessionUpdate(DBAccount);
}
} // v - password verifier.
}
}
public int HashCode
{
get
{
return DBAccount.HashCode;
}
get => DBAccount.HashCode;
private set
{
lock (DBAccount)
{
DBAccount.HashCode = value;
DBSessions.SessionUpdate(DBAccount);
}
}
}
public string BattleTagName
{
@ -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<FieldOperation>)$[/].");
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<FieldOperation>();
//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}] }}";
}
/// <summary>

View File

@ -22,7 +22,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
public static int TotalAccounts => DBSessions.SessionQuery<DBAccount>().Count();
public static readonly ConcurrentDictionary<ulong, Account> LoadedAccounts = new ConcurrentDictionary<ulong, Account>();
public static readonly ConcurrentDictionary<ulong, Account> LoadedAccounts = new();
public static void PreLoadAccounts()
{

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@ namespace DiIiS_NA.LoginServer.AccountsSystem
{
private static readonly Logger Logger = LogManager.CreateLogger("DataBaseSystem");
public static readonly ConcurrentDictionary<ulong, GameAccount> LoadedGameAccounts = new ConcurrentDictionary<ulong, GameAccount>();
public static readonly ConcurrentDictionary<ulong, GameAccount> 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

View File

@ -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<byte>().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<byte>().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<byte>() // 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<byte>() // 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<byte>()
.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

View File

@ -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();

View File

@ -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<NoData> done)
public override void Subscribe(Google.ProtocolBuffers.IRpcController controller, SubscribeRequest request, Action<NoData> 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<NoData> 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<NoData> 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<NoData> 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<NoData> done)
public override void SuggestInvitation(Google.ProtocolBuffers.IRpcController controller, SuggestInvitationRequest request, Action<NoData> 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 => { }));
}

View File

@ -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<GetStateResponse> done)
{

View File

@ -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<bgs.protocol.channel.v1.CreateChannelResponse> done)
public override void CreateChannel(IRpcController controller, CreateChannelRequest request, Action<CreateChannelResponse> 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<bgs.protocol.channel.v1.GetChannelInfoResponse> done)
public override void GetChannelInfo(IRpcController controller, GetChannelInfoRequest request, Action<GetChannelInfoResponse> 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<bgs.protocol.channel.v1.JoinChannelResponse> done)
public override void JoinChannel(IRpcController controller, JoinChannelRequest request, Action<JoinChannelResponse> 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<bgs.protocol.channel.v1.SubscribeChannelResponse> done)
public override void SubscribeChannel(IRpcController controller, SubscribeChannelRequest request, Action<SubscribeChannelResponse> 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());

View File

@ -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<bgs.protocol.NoData> done)
public override void Dissolve(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.DissolveRequest request, Action<bgs.protocol.NoData> done)
{
throw new NotImplementedException();
}
public override void RemoveMember(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.RemoveMemberRequest request, System.Action<bgs.protocol.NoData> done)
public override void RemoveMember(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.RemoveMemberRequest request, Action<bgs.protocol.NoData> 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<bgs.protocol.NoData> done)
public override void SendMessage(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.SendMessageRequest request, Action<bgs.protocol.NoData> 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<bgs.protocol.NoData> done)
public override void UpdateChannelState(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.UpdateChannelStateRequest request, Action<bgs.protocol.NoData> 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<bgs.protocol.NoData> done)
public override void UpdateMemberState(Google.ProtocolBuffers.IRpcController controller, bgs.protocol.channel.v1.UpdateMemberStateRequest request, Action<bgs.protocol.NoData> done)
{
var channel = ChannelManager.GetChannelByDynamicId(((controller as HandlerController).LastCallHeader).ObjectId);
var builder = bgs.protocol.NoData.CreateBuilder();

View File

@ -75,9 +75,9 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
public override void RequestDisconnect(IRpcController controller, DisconnectRequest request, Action<NO_RESPONSE> 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);
}
}
}

View File

@ -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<bgs.protocol.NoData> done)
public override void AcceptInvitation(IRpcController controller, AcceptInvitationRequest request, Action<NoData> 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<bgs.protocol.NoData> done)
public override void RevokeInvitation(IRpcController controller, RevokeInvitationRequest request, Action<NoData> done)
{
throw new NotImplementedException();
}
public override void DeclineInvitation(IRpcController controller, DeclineInvitationRequest request, Action<bgs.protocol.NoData> done)
public override void DeclineInvitation(IRpcController controller, DeclineInvitationRequest request, Action<NoData> 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<bgs.protocol.NoData> done)
public override void IgnoreInvitation(IRpcController controller, IgnoreInvitationRequest request, Action<NoData> done)
{
//throw new NotImplementedException();
var response = bgs.protocol.NoData.CreateBuilder();
var response = NoData.CreateBuilder();
done(response.Build());
FriendManager.HandleIgnore(((controller as HandlerController).Client), request);

View File

@ -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) =>

View File

@ -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<NoData> 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<NoData> done)
{
var builder = bgs.protocol.NoData.CreateBuilder();
var builder = NoData.CreateBuilder();
done(builder.Build());
//throw new NotImplementedException();
}

View File

@ -74,7 +74,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
public override void Query(IRpcController controller, QueryRequest request, Action<QueryResponse> 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<NoData> done)
public override void Subscribe(IRpcController controller, SubscribeRequest request, Action<NoData> 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<NoData> done)
public override void Unsubscribe(IRpcController controller, UnsubscribeRequest request, Action<NoData> 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());
}

View File

@ -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 };

View File

@ -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<CreateSessionResponse> 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<NoData> 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());
}
@ -58,9 +61,7 @@ namespace DiIiS_NA.LoginServer.ServicesSystem.Services
}
public override void GetSignedSessionState(IRpcController controller, GetSignedSessionStateRequest request, Action<GetSignedSessionStateResponse> done)
{
done(GetSignedSessionStateResponse.CreateBuilder().SetToken("eyJ0eXAiOiJKV1QiLCJlbnYiOiJwcm9kLmV1IiwiYWxnIjoiUlMyNTYiLCJraWQiOiJmMDE5NzgzMi0zMWMwLTQzN2MtOTc2NC1iMzliOTM5MDJlNWMiLCJrdHkiOiJSU0EifQ").Build());
}
=> done(GetSignedSessionStateResponse.CreateBuilder().SetToken("eyJ0eXAiOiJKV1QiLCJlbnYiOiJwcm9kLmV1IiwiYWxnIjoiUlMyNTYiLCJraWQiOiJmMDE5NzgzMi0zMWMwLTQzN2MtOTc2NC1iMzliOTM5MDJlNWMiLCJrdHkiOiJSU0EifQ").Build());
public override void MarkSessionsAlive(IRpcController controller, MarkSessionsAliveRequest request, Action<MarkSessionsAliveResponse> done)
{

View File

@ -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<SubscribeResponse> done)
public override void Subscribe(IRpcController controller, SubscribeRequest request, Action<SubscribeResponse> 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<NoData> 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<NoData> 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<NoData> done)
{
Logger.Trace("UnblockPlayer()");
Logger.MethodTrace("UnblockPlayer()");
done(NoData.CreateBuilder().Build());
UserManager.UnblockAccount(((controller as HandlerController).Client), request);

View File

@ -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<DBActiveSkills>(s => s.DBToon.Id == this.PersistentID);
return DBSessions.SessionQuerySingle<DBActiveSkills>(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<DBInventory>(inv => inv.DBToon.Id == this.PersistentID && inv.EquipmentSlot > 0 && inv.EquipmentSlot < 15 && inv.ForSale == false);
var visibleEquipment = DBSessions.SessionQueryWhere<DBInventory>(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<D3.Hero.VisualEquipment>(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);
/// <summary>
/// D3 EntityID encoded id.
@ -158,19 +160,19 @@ namespace DiIiS_NA.LoginServer.Toons
/// </summary>
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
/// </summary>
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<DBBonusSets>(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == this.PersistentID);
return _editions.Count() > 0;
return DBSessions.SessionQueryWhere<DBBonusSets>(dbi => dbi.SetId == 6 && dbi.ClaimedToon.Id == PersistentID).Any();
}
set { }
@ -256,22 +257,20 @@ namespace DiIiS_NA.LoginServer.Toons
/// </summary>
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
/// </summary>
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
/// </summary>
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
/// </summary>
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)
/// </summary>
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)
/// </summary>
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
/// </summary>
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
/// </summary>
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
/// </summary>
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
/// </summary>
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
/// </summary>
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;
}
/// <summary>
@ -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<DBQuestHistory> _dbQuests = null;
_dbQuests = DBSessions.SessionQueryWhere<DBQuestHistory>(dbi => dbi.DBToon.Id == this.PersistentID);
_dbQuests = DBSessions.SessionQueryWhere<DBQuestHistory>(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<DBInventory> heroInventoryItems = DBSessions.SessionQueryWhere<DBInventory>(dbi => dbi.DBToon.Id == this.PersistentID);
List<DBInventory> heroInventoryItems = DBSessions.SessionQueryWhere<DBInventory>(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<int, int> visualToSlotMapping = new Dictionary<int, int> { { 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<int> _allQuests = new List<int>() { 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<DBQuestHistory>(qh => qh.DBToon.Id == this.PersistentID);
var questList = DBSessions.SessionQueryWhere<DBQuestHistory>(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<bgs.protocol.presence.v1.FieldOperation> GetSubscriptionNotifications()
{
var operationList = new List<bgs.protocol.presence.v1.FieldOperation>();
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);
}
}

View File

@ -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);
}

View File

@ -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<D3.AchievementsStaticData.StaticAchievementDefinition> 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<D3.AchievementsStaticData.StaticCriteriaDefinition> 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)

View File

@ -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.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<string> 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.";
}

View File

@ -10,88 +10,119 @@ 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
/// <summary>
/// Rate of experience gain.
/// </summary>
public float RateExp
{
get => GetFloat("RateExp", 1);
set => Set("RateExp", value);
get => GetFloat(nameof(RateExp), 1);
set => Set(nameof(RateExp), value);
}
/// <summary>
/// Rate of gold gain.
/// </summary>
public float RateMoney
{
get => GetFloat("RateMoney", 1);
set => Set("RateMoney", value);
get => GetFloat(nameof(RateMoney), 1);
set => Set(nameof(RateMoney), value);
}
/// <summary>
/// Rate of item drop.
/// </summary>
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);
}
/// <summary>
/// Rate of monster's HP.
/// </summary>
public float RateMonsterHP
{
get => GetFloat("RateMonsterHP", 1);
set => Set("RateMonsterHP", value);
get => GetFloat(nameof(RateMonsterHP), 1);
set => Set(nameof(RateMonsterHP), value);
}
/// <summary>
/// Rate of monster's damage.
/// </summary>
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);
}
/// <summary>
/// Percentage that a unique, legendary, set or special item created is unidentified
/// </summary>
public float ChanceHighQualityUnidentified
{
get => GetFloat(nameof(ChanceHighQualityUnidentified), 30f);
set => Set(nameof(ChanceHighQualityUnidentified), value);
}
/// <summary>
/// Percentage that a normal item created is unidentified
/// </summary>
public float ChanceNormalUnidentified
{
get => GetFloat(nameof(ChanceNormalUnidentified), 5f);
set => Set(nameof(ChanceNormalUnidentified), value);
}
public static Config Instance { get; } = new();

View File

@ -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;

View File

@ -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)
{

View File

@ -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;

View File

@ -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);
}

View File

@ -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)
{

View File

@ -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,36 +1317,51 @@ 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;
}
/// <summary>
/// Randomly sets unidentified flag on item.
/// If the item is unique, legendary, special or set, it will have <see cref="Config.ChanceHighQualityUnidentified"/>% chance to be unidentified.
/// Otherwise, it will have <see cref="Config.ChanceNormalUnidentified"/>% chance to be unidentified.
/// </summary>
/// <param name="item">The item to set the flag</param>
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];

View File

@ -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;

View File

@ -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);

View File

@ -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
/// <summary>
/// ActorType = Player.
/// </summary>
public override ActorType ActorType { get { return ActorType.Player; } }
public override ActorType ActorType => ActorType.Player;
/// <summary>
/// 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<PlayerQuestRewardHistoryEntry>();
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
public float ModelScale =>
Toon.Class switch
{
get
{
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<int> { 19947, 168314, 92945, 197101 };
var townAreas = new List<int> { 19947, 168314, 92945, 197101 };
var proximity = new RectangleF(Position.X - 1f, Position.Y - 1f, 2f, 2f);
var scenes = World.QuadTree.Query<Scene>(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)

View File

@ -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];

View File

@ -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);
}
})
});

View File

@ -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();