Цитата:
Сообщение от PROGRAMMATOR
Сервер его отправляет только при смене состояния слотов.
|
Все равно не могу допереть....
Тут он берет аккаунт по логину.
Свернуть ↑
class PROTOCOL_LOGIN_REQ : ClientPacket
{
private string Login, Password;
public override void ReadImpl()
{
byte[] Unk = ReadBytes(100);
Password = ReadString();
Login = ReadString();
Log.Info($"Login {Login} Password {Password}");
}
public override void RunImpl()
{
var manager = AccountManager.Instance;
Client.Account = manager.GetAccount(Login);
Client.SendPacket(new PROTOCOL_LOGIN_ACK(manager.IsValidAccount(Login, Password), Client.Account));
}
Code: C#
Свернуть ↑Развернуть ↓
Тут он лишь проверяет аккаунт в базе по логину и ищет тоже по логину.
Свернуть ↑
public class AccountDao : IAccountDao
{
private static readonly Logger Log = Logger.Instance;
private DatabaseFactory Factory = DatabaseFactory.Instance;
static readonly Dictionary<int, Account> Accounts = new Dictionary<int, Account>();
public static void Initialize()
{
Uri uri = new Uri("http://" + CachedConfig.IPAddress + ":" + CachedConfig.Port + "/IAccountDao");
ServiceHost host = new ServiceHost(typeof(AccountDao), uri);
host.AddServiceEndpoint(typeof(IAccountDao), new BasicHttpBinding(), "");
host.Open();
Log.Info("WCF Service [{0}] successfully loaded", uri.OriginalString);
}
public LoginState IsValidAccount(string login, string password)
{
using (var connection = Factory.conn)
{
string sql = @"SELECT `accounts`.* FROM `accounts` WHERE `Login` = @Login LIMIT 1";
var account = SqlMapper.Query<Account>(connection, sql, new { Login = login }).FirstOrDefault();
if (account.Password == password)
{
if (Accounts.ContainsKey(account.Id))
{
return LoginState.ID_IS_ALREADY_LOGGED_IN;
}
else
{
Accounts.Add(account.Id, account);
return LoginState.LOGGED_IN_OK;
}
}
else
{
return LoginState.ID_OR_PASSWORD_INCORRECT;
}
}
}
public Account GetAccount(string login)
{
using (var connection = Factory.conn)
{
string sql = @"SELECT `accounts`.* FROM `accounts` WHERE `Login` IN(@Login) LIMIT 1";
var account = SqlMapper.Query<Account>(connection, sql, new { Login = login }).FirstOrDefault();
return account;
}
}
public void RemoveAccount(int id)
{
Accounts.Remove(id);
}
}
}
Code: C#
Свернуть ↑Развернуть ↓
тут он находит player только по accountid , но как сделать так чтобы он не посылал null везде где я его хочу использовать хз.
Свернуть ↑
public class PlayerDao : IPlayerDao
{
private static readonly Logger Log = Logger.Instance;
private DatabaseFactory Factory = DatabaseFactory.Instance;
public static void Initialize()
{
Uri uri = new Uri("http://" + CachedConfig.IPAddress + ":" + CachedConfig.Port + "/IPlayerDao");
ServiceHost host = new ServiceHost(typeof(PlayerDao), uri);
host.AddServiceEndpoint(typeof(IPlayerDao), new BasicHttpBinding(), "");
host.Open();
Log.Info("WCF Service [{0}] successfully loaded", uri.OriginalString);
}
public Player GetPlayer(int accountId)
{
try
{
using (var connection = Factory.conn)
{
string sql = @"SELECT `players`.* FROM `players` WHERE `AccountId` = @AccountId LIMIT 1";
var account = SqlMapper.Query<Player>(connection, sql, new { AccountId = accountId }).FirstOrDefault();
return account;
}
}
catch (Exception ex)
{
Log.Error(ex.ToString());
}
return null;
}
}
}
Code: C#
Свернуть ↑Развернуть ↓