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:
parent
0ba94f6147
commit
b66569abbd
@ -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>
|
||||
|
||||
@ -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
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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 => { }));
|
||||
}
|
||||
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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());
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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) =>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -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();
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
|
||||
@ -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 };
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -19,7 +19,10 @@ using System.Linq;
|
||||
using DiIiS_NA.GameServer.GSSystem.GameSystem;
|
||||
using DiIiS_NA.GameServer.GSSystem.ObjectsSystem;
|
||||
using DiIiS_NA.GameServer.GSSystem.PlayerSystem;
|
||||
using DiIiS_NA.GameServer.MessageSystem.Message.Definitions.Animation;
|
||||
using DiIiS_NA.GameServer.MessageSystem.Message.Fields;
|
||||
using DiIiS_NA.LoginServer.AccountsSystem;
|
||||
using FluentNHibernate.Utils;
|
||||
using static DiIiS_NA.Core.MPQ.FileFormats.GameBalance;
|
||||
|
||||
namespace DiIiS_NA.GameServer.CommandManager
|
||||
@ -78,22 +81,25 @@ namespace DiIiS_NA.GameServer.CommandManager
|
||||
{
|
||||
foreach (var world in game.Worlds)
|
||||
{
|
||||
info.Add("");
|
||||
info.Add($" World: {world.SNO.ToString()} - {(int)world.SNO}");
|
||||
info.Add($" Players: {world.Players.Count}");
|
||||
info.Add($" Monsters: {world.Monsters.Count}");
|
||||
info.Add($"World: {world.SNO.ToString()} - {(int)world.SNO}");
|
||||
info.Add($"Players: {world.Players.Count}");
|
||||
info.Add($"Monsters: {world.Monsters.Count}");
|
||||
info.Add($"{world.Monsters.Count} players in world: ");
|
||||
foreach (var playerInWorld in world.Players)
|
||||
{
|
||||
info.Add($">>>>> Player[{playerInWorld.Value.PlayerIndex}] <<<<<");
|
||||
info.Add($"Id: {playerInWorld.Value.GlobalID}");
|
||||
info.Add($"> Player[{playerInWorld.Value.PlayerIndex}]");
|
||||
info.Add($"> Id: {playerInWorld.Value.GlobalID}");
|
||||
// info.Add($"Index: {playerInWorld.Value.PlayerIndex}");
|
||||
info.Add($"Name: {playerInWorld.Value.Name}");
|
||||
info.Add($"Class: {playerInWorld.Value.Toon.Class.ToString()}");
|
||||
info.Add($"Level: {playerInWorld.Value.Toon.Level}");
|
||||
info.Add($"> Name: {playerInWorld.Value.Name}");
|
||||
info.Add($"> Class: {playerInWorld.Value.Toon.Class.ToString()}");
|
||||
info.Add($"> Level: {playerInWorld.Value.Toon.Level}");
|
||||
info.Add(
|
||||
$" Health: {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Cur]} / {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Max]}");
|
||||
info.Add($" Damage: {playerInWorld.Value.Attributes[GameAttribute.Damage_Min, 0]}");
|
||||
$"> Health: {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Cur]} / {playerInWorld.Value.Attributes[GameAttribute.Hitpoints_Max]}");
|
||||
info.Add($"> Damage: {playerInWorld.Value.Attributes[GameAttribute.Damage_Min, 0]}");
|
||||
info.Add("");
|
||||
}
|
||||
|
||||
info.Add("");
|
||||
}
|
||||
}
|
||||
|
||||
@ -101,9 +107,43 @@ namespace DiIiS_NA.GameServer.CommandManager
|
||||
}
|
||||
}
|
||||
|
||||
[CommandGroup("identify", "Identifies all items in your inventory.", Account.UserLevels.Tester)]
|
||||
public class IdentifyCommand
|
||||
{
|
||||
[DefaultCommand()]
|
||||
public string Identify(string[] @params, BattleClient invokerClient)
|
||||
{
|
||||
if (invokerClient?.InGameClient?.Player is not { } player)
|
||||
return "You must be in game to use this command.";
|
||||
|
||||
var unidentified = player.Inventory.GetBackPackItems().Where(i => i.Unidentified).ToArray();
|
||||
int count = unidentified.Length;
|
||||
player.StartCasting(60*2, new Action(() =>
|
||||
{
|
||||
foreach (var item in unidentified)
|
||||
item.Identify();
|
||||
}));
|
||||
return $"Identified {count} items.";
|
||||
}
|
||||
}
|
||||
[CommandGroup("followers", "Manage your followers.", Account.UserLevels.Tester)]
|
||||
public class FollowersCommand : CommandGroup
|
||||
{
|
||||
[Command("list", "List all followers.")]
|
||||
public string List(string[] @params, BattleClient invokerClient)
|
||||
{
|
||||
if (invokerClient?.InGameClient?.Player is not { } player)
|
||||
return "You must be in game to use this command.";
|
||||
|
||||
List<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.";
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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)
|
||||
{
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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];
|
||||
|
||||
@ -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);
|
||||
}
|
||||
})
|
||||
});
|
||||
|
||||
@ -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();
|
||||
|
||||
Loading…
Reference in New Issue
user.block.title