Skip to content
Permalink
Browse files
Character, loaded from DB
  • Loading branch information
amPerl committed Aug 30, 2014
1 parent 7e63425 commit a0fa4fd73944c11b74551c53cc26c495975b57a1
Show file tree
Hide file tree
Showing 9 changed files with 161 additions and 48 deletions.
@@ -1,5 +1,7 @@
using System;
using Rice.Server.Structures;
using System;
using System.Collections.Generic;
using System.Data.Common;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@@ -8,5 +10,107 @@ namespace Rice.Game
{
public class Character
{
public User User;
public ulong UID;
public ulong CID;

public string Name;
public long Mito;
public int Avatar;
public int Level;
public byte City;
public byte CurrentCarID;
public byte GarageLevel;
public long TID;

private Character()
{
}

public CharInfo GetInfo()
{
return new CharInfo
{
Avatar = (ushort)Avatar,
Name = Name,
CID = CID,
City = City,
CurrentCarID = CurrentCarID,
ExpInfo = new ExpInfo // load this
{
BaseExp = 0,
CurExp = 0,
NextExp = 0
},
HancoinGarage = GarageLevel,
Level = (ushort)Level,
TeamId = TID,
TeamName = "Staff", // load this
MitoMoney = Mito
};
}

public static Character Retrieve(string charname)
{
DbConnection dbconn = Database.GetConnection();

DbCommand command = dbconn.CreateTextCommand("SELECT * FROM Characters WHERE Name = @char");

command.AddParameter("@char", charname);

Character character = null;

using (DbDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
character = new Character();
character.CID = Convert.ToUInt64(reader["CID"]);
character.UID = Convert.ToUInt64(reader["UID"]);
character.Name = reader["Name"] as string;
character.Mito = Convert.ToInt64(reader["Mito"]);
character.Avatar = Convert.ToByte(reader["Avatar"]);
character.Level = Convert.ToUInt16(reader["Level"]);
character.City = Convert.ToByte(reader["City"]);
character.CurrentCarID = Convert.ToByte(reader["CurrentCarID"]);
character.GarageLevel = Convert.ToByte(reader["GarageLevel"]);
character.TID = Convert.ToInt64(reader["TID"]);
}
}

return character;
}

public static List<Character> Retrieve(ulong uid)
{
DbConnection dbconn = Database.GetConnection();

DbCommand command = dbconn.CreateTextCommand("SELECT * FROM Characters WHERE UID = @uid");

command.AddParameter("@uid", uid);

List<Character> chars = new List<Character>();

using (DbDataReader reader = command.ExecuteReader())
{
while (reader.Read())
{
var character = new Character();
character.CID = Convert.ToUInt64(reader["CID"]);
character.UID = Convert.ToUInt64(reader["UID"]);
character.Name = reader["Name"] as string;
character.Mito = Convert.ToInt64(reader["Mito"]);
character.Avatar = Convert.ToByte(reader["Avatar"]);
character.Level = Convert.ToUInt16(reader["Level"]);
character.City = Convert.ToByte(reader["City"]);
character.CurrentCarID = Convert.ToByte(reader["CurrentCarID"]);
character.GarageLevel = Convert.ToByte(reader["GarageLevel"]);
character.TID = Convert.ToInt64(reader["TID"]);
chars.Add(character);
}
}

return chars;
}
}
}
@@ -13,7 +13,7 @@ public class Player

public User User;
public List<Character> Characters;
public string ActiveCharacter;
public Character ActiveCharacter;

private RiceClient authClient, lobbyClient, areaClient, gameClient;
public RiceClient AuthClient { get { return authClient; } set { authClient = value; authClient.Player = this; } }
@@ -19,7 +19,7 @@ public enum UserStatus : byte
public class User
{
public ulong UID;
public string Username;
public string Name;
public string PasswordHash;
public UserStatus Status;
public string CreateIP;
@@ -55,7 +55,7 @@ public static User Retrieve(string username, string passwordHash)
{
user = new User();
user.UID = Convert.ToUInt64(reader["UID"]);
user.Username = reader["Username"] as string;
user.Name = reader["Username"] as string;
user.PasswordHash = reader["PasswordHash"] as string;
user.Status = (UserStatus)Convert.ToByte(reader["Status"]);
user.CreateIP = reader["CreateIP"] as string;
@@ -81,7 +81,33 @@ public static User Retrieve(string username)
{
user = new User();
user.UID = Convert.ToUInt64(reader["UID"]);
user.Username = reader["Username"] as string;
user.Name = reader["Username"] as string;
user.PasswordHash = reader["PasswordHash"] as string;
user.Status = (UserStatus)Convert.ToByte(reader["Status"]);
user.CreateIP = reader["CreateIP"] as string;
}
}

return user;
}

public static User Retrieve(ulong uid)
{
DbConnection dbconn = Database.GetConnection();

DbCommand command = dbconn.CreateTextCommand("SELECT * FROM Users WHERE UID = @uid");

command.AddParameter("@uid", uid);

User user = null;

using (DbDataReader reader = command.ExecuteReader())
{
if (reader.Read())
{
user = new User();
user.UID = Convert.ToUInt64(reader["UID"]);
user.Name = reader["Username"] as string;
user.PasswordHash = reader["PasswordHash"] as string;
user.Status = (UserStatus)Convert.ToByte(reader["Status"]);
user.CreateIP = reader["CreateIP"] as string;
@@ -36,7 +36,7 @@ public static void UserAuth(RicePacket packet)
}
else if (user.Status == UserStatus.Banned)
{
Log.WriteLine("Attempt to log into suspended account {0}.", user.Username);
Log.WriteLine("Attempt to log into suspended account {0}.", user.Name);

packet.Sender.Error("Your account has been suspended.");
packet.Sender.Kill();
@@ -14,32 +14,18 @@ public static void LoadCharacter(RicePacket packet)
{
string characterName = packet.Reader.ReadUnicode();

packet.Sender.Player = new Rice.Game.Player(Rice.Game.User.Empty); // TODO: load user info on checkin
packet.Sender.Player.ActiveCharacter = characterName; // TODO: verify this
var character = Rice.Game.Character.Retrieve(characterName); // TODO: verify this
var user = Rice.Game.User.Retrieve(character.UID);

packet.Sender.Player = new Rice.Game.Player(user);
packet.Sender.Player.Characters = Rice.Game.Character.Retrieve(user.UID);
packet.Sender.Player.ActiveCharacter = character;

var ack = new RicePacket(124);

var ackStruct = new Structures.LoadCharAck
{
CharInfo = new Structures.CharInfo
{
Avatar = 1,
Name = characterName,
Cid = 1,
City = 1,
CurCarId = 1,
ExpInfo = new Structures.ExpInfo
{
BaseExp = 0,
CurExp = 0,
NextExp = 0
},
HancoinGarage = 1,
Level = 80,
TeamId = 1,
TeamName = "Staff",
MitoMoney = 123456789
},
CharInfo = character.GetInfo(),
nCarSize = 1,
CarInfo = new List<Structures.CarInfo>()
{
@@ -16,7 +16,7 @@ public static void ChatMessage(RicePacket packet)
bool green = packet.Reader.ReadUInt32() == 0xFF00FF00; // need to ignore this and check for rank serverside
string message = packet.Reader.ReadUnicodePrefixed();

string sender = packet.Sender.Player.ActiveCharacter;
string sender = packet.Sender.Player.ActiveCharacter.Name;

Console.WriteLine("({0}) <{1}> {2}", type, sender, message);

@@ -21,12 +21,8 @@ public static void CheckInLobby(RicePacket packet)
uint time = packet.Reader.ReadUInt32();
string stringTicket = packet.Reader.ReadASCIIStatic(0x40);

Player player = null;
bool verifyTicket = true;

#if DEBUG
verifyTicket = false;
player = new Player(Rice.Game.User.Retrieve(username));
packet.Sender.Player = new Player(Rice.Game.User.Retrieve("admin"));
#else

foreach (var p in RiceServer.GetPlayers())
@@ -40,7 +36,7 @@ public static void CheckInLobby(RicePacket packet)
}
#endif

if (player == null)
if (packet.Sender.Player == null)
{
Log.WriteLine("Rejecting {0} (ticket {1}) for invalid user-ticket combination.", username, ticket);
packet.Sender.Error("Invalid ticket-user combination.");
@@ -19,31 +19,32 @@ public static void UserInfo(RicePacket packet)
settings.Writer.Write(Static.GameSettings);
packet.Sender.Send(settings);

packet.Sender.Player.Characters = Rice.Game.Character.Retrieve(packet.Sender.Player.User.UID);

var ack = new RicePacket(61);

ack.Writer.Write(0); // Permissions
ack.Writer.Write(2); // Character Count
ack.Writer.Write(packet.Sender.Player.Characters.Count); // Character Count

ack.Writer.WriteUnicodeStatic("userName", 18); // Username
ack.Writer.WriteUnicodeStatic(packet.Sender.Player.User.Name, 18); // Username
ack.Writer.Write((long)0);
ack.Writer.Write((long)0);
ack.Writer.Write((long)0);
ack.Writer.Write(0);

// Generate 2 characters
for (int i = 1; i <= 2; i++)
foreach (var character in packet.Sender.Player.Characters)
{
ack.Writer.WriteUnicodeStatic("char" + i, 21); // Name
ack.Writer.Write((ulong)i); // ID
ack.Writer.Write(i); // Avatar
ack.Writer.Write(i * 20); // Level
ack.Writer.WriteUnicodeStatic(character.Name, 21); // Name
ack.Writer.Write(character.CID); // ID
ack.Writer.Write(character.Avatar); // Avatar
ack.Writer.Write(character.Level); // Level
ack.Writer.Write(1);
ack.Writer.Write(0x50);
ack.Writer.Write(0);
ack.Writer.Write(int.MaxValue / 2); // Creation Date
ack.Writer.Write((ulong)1); // Crew ID
ack.Writer.Write(character.TID); // Crew ID
ack.Writer.Write(0L); // Crew Image
ack.Writer.WriteUnicodeStatic("Staff, maybe", 12); // Crew Name
ack.Writer.WriteUnicodeStatic("Staff", 12); // Crew Name
ack.Writer.Write((short)0);
ack.Writer.Write((short)-1);
ack.Writer.Write((short)0);
@@ -42,7 +42,7 @@ public void Serialize(PacketWriter writer)

public struct CharInfo : ISerializable
{
public long Cid;
public ulong CID;
public string Name; // 0x15
public string LastMessageFrom; // 0xB
public int LastDate;
@@ -66,7 +66,7 @@ public struct CharInfo : ISerializable
public int LastChannel;
public int City;
public int PosState;
public int CurCarId;
public int CurrentCarID;
public uint QuickSlot1;
public uint QuickSlot2;
public int TeamJoinDate;
@@ -80,7 +80,7 @@ public struct CharInfo : ISerializable

public void Serialize(PacketWriter writer)
{
writer.Write(Cid);
writer.Write(CID);
writer.WriteUnicodeStatic(Name, 0x15);
writer.WriteUnicodeStatic(LastMessageFrom, 0xB);
writer.Write(LastDate);
@@ -110,7 +110,7 @@ public void Serialize(PacketWriter writer)
writer.Write(LastChannel);
writer.Write(City);
writer.Write(PosState);
writer.Write(CurCarId);
writer.Write(CurrentCarID);
writer.Write(QuickSlot1);
writer.Write(QuickSlot2);
writer.Write(TeamJoinDate);

0 comments on commit a0fa4fd

Please sign in to comment.