Skip to content

Commit

Permalink
Fixes #3 although still wonky
Browse files Browse the repository at this point in the history
Fixes #25
Fixes #27
  • Loading branch information
exmex committed Oct 3, 2017
1 parent 7efec8d commit 1b1dece
Show file tree
Hide file tree
Showing 5 changed files with 93 additions and 13 deletions.
16 changes: 13 additions & 3 deletions src/AreaServer/Network/Handlers/EnterArea.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Shared.Models;
using Shared.Network;
using Shared.Network.AreaServer;
using Shared.Util;

namespace AreaServer.Network.Handlers
{
Expand All @@ -11,7 +12,7 @@ public static void Handle(Packet packet)
{
var enterAreaPacket = new EnterAreaPacket(packet);

if (packet.Sender.User == null)
if (packet.Sender.User == null || packet.Sender.User.VehicleSerial != enterAreaPacket.VehicleSerial)
{
var character = CharacterModel.Retrieve(AreaServer.Instance.Database.Connection, enterAreaPacket.CharacterName);
if (character == null)
Expand All @@ -29,8 +30,17 @@ public static void Handle(Packet packet)

packet.Sender.User = account;
packet.Sender.User.ActiveCharacter = character;

DefaultServer.ActiveSerials.Add(enterAreaPacket.VehicleSerial, packet.Sender.User);

if (DefaultServer.ActiveSerials.ContainsKey(enterAreaPacket.VehicleSerial))
{
if (packet.Sender.User.VehicleSerial != enterAreaPacket.VehicleSerial)
{
packet.Sender.KillConnection($"[{packet.Sender.User.VehicleSerial} vs {enterAreaPacket.VehicleSerial}] Still wrong user.");
return;
}

}else
DefaultServer.ActiveSerials.Add(enterAreaPacket.VehicleSerial, packet.Sender.User);
}

packet.Sender.Send(new EnterAreaAnswer
Expand Down
16 changes: 15 additions & 1 deletion src/AreaServer/Network/Handlers/MoveVehicle.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,36 @@
using System.Linq;
using Shared.Network;
using Shared.Network.AreaServer;

namespace AreaServer.Network.Handlers
{
public class MoveVehicle
{
/// <summary>
/// Ack size: 110
/// </summary>
/// <param name="packet"></param>
[Packet(Packets.CmdMoveVehicle)]
public static void Handle(Packet packet)
{
var vehicleSerial = packet.Reader.ReadUInt16();
//packet.Reader.ReadUInt16(); // Age.
var movement = packet.Reader.ReadBytes(112);
/*var moveVehiclePkt = new MoveVehiclePacket(packet);
var validSerial = DefaultServer.ActiveSerials.FirstOrDefault(pair => pair.Value == packet.Sender.User);
if (validSerial.Value == null || validSerial.Key != vehicleSerial)
if (validSerial.Value == null || validSerial.Key != moveVehiclePkt.VehicleSerial)
{
packet.Sender.KillConnection("Vehicle serial didn't match!");
return;
}
var ack = new MoveVehicleAnswer()
{
}
// TODO: Make plausability check?*/

var move = new Packet(Packets.CmdMoveVehicle); // 114 total length
move.Writer.Write(vehicleSerial);
Expand Down
2 changes: 1 addition & 1 deletion src/GameServer/Network/Handlers/Chat/ChatMessage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public static void Handle(Packet packet)
GameServer.Instance.Server.Broadcast(packet.Sender.User.ActiveCharacter.Team, ackPkt); // TODO: broadcast only to users in same crew
}
else
packet.Sender.SendError("Not a member of the crew.");
packet.Sender.SendError("Not a member of a crew.");
break;

default:
Expand Down
61 changes: 54 additions & 7 deletions src/GameServer/Network/Handlers/Join/PlayerInfoReq.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,27 +14,68 @@ public static void Handle(Packet packet)
{
/*
amPerl: No known scenarios where the requested info count is > 1
We'll see about that. For now just sending multiple if we have multiple.
*/

var pinfoReq = new PlayerInfoReqPacket(packet);
if (pinfoReq.VehicleSerials.Length != 1)
{
Log.Error($"Sent PlayerInfoReq with {pinfoReq.VehicleSerials.Length} serials!");
return;
}

var client = GameServer.Instance.Server.GetClient(pinfoReq.VehicleSerials[0]);
if (client?.User?.ActiveCharacter == null) // Make sure we have loaded a char
{
Log.Error("firstClient.User.ActiveCharacter == null");

#if !DEBUG
packet.Sender.KillConnection("Character for CmdPlayerInfoReq not found");
#else
packet.Sender.SendError("Character not loaded!");
packet.Sender.Send(new PlayerInfoOldAnswer().CreatePacket());
#endif
return;
}

var ack = new PlayerInfoOldAnswer
{
PlayerInfo = new XiPlayerInfo()
{
CharacterName = client.User.ActiveCharacter.Name,
Serial = (ushort) client.User.VehicleSerial,
Age = 0
}
};
packet.Sender.Send(ack.CreatePacket());

/*
var clients = (List<Client>)GameServer.Instance.Server.GetClients(pinfoReq.VehicleSerials);
var ack = new PlayerInfoOldAnswer();
if (clients == null || clients.Count == 0)
{
Log.Error($"PlayerInfoReq: Requested serial {pinfoReq.VehicleSerials[0]} no client was found.");
#if !DEBUG
packet.Sender.KillConnection("Character for CmdGameCharInfo not found");
#else
packet.Sender.SendError("Vehicle for serial not found");
packet.Sender.Send(ack.CreatePacket());
#endif
return;
}
var firstClient = clients[0];
if (firstClient.User.ActiveCharacter == null) // Make sure we have loaded a char for first client
{
Log.Error("Clients character info was invalid.");
Log.Error("firstClient.User.ActiveCharacter == null");
#if !DEBUG
packet.Sender.KillConnection("Character for CmdPlayerInfoReq not found");
#else
packet.Sender.SendError("Character not loaded!");
packet.Sender.Send(ack.CreatePacket());
#endif
return;
}
Expand All @@ -44,6 +85,7 @@ public static void Handle(Packet packet)
Serial = (ushort)firstClient.User.VehicleSerial,
Age = 0
};
clients.RemoveAt(0); // Make sure we don't have a first player info anymore
ack.PlayerInfos = new XiPlayerInfo[clients.Count];
for (var i = 0; i < clients.Count; i++)
Expand All @@ -52,15 +94,20 @@ public static void Handle(Packet packet)
if (client.User.ActiveCharacter == null) // Make sure we have loaded a char
{
Log.Error("Clients character info was invalid.");

Log.Error("client.User.ActiveCharacter == null");
#if !DEBUG
packet.Sender.KillConnection("Character for CmdPlayerInfoReq not found");
return;
#else
packet.Sender.SendError("Character not loaded!");
ack.PlayerInfos[i] = ack.PlayerInfo = new XiPlayerInfo()
{
CharacterName = "InvalidChar",
Serial = (ushort)client.User.VehicleSerial,
Age = 0
};
continue;
#endif
}
ack.PlayerInfos[i] = ack.PlayerInfo = new XiPlayerInfo()
Expand All @@ -69,8 +116,8 @@ public static void Handle(Packet packet)
Serial = (ushort)client.User.VehicleSerial,
Age = 0
};
}
}*/

/* Send only one:
var serial = packet.Reader.ReadUInt16(); // amPerl: No known scenarios where the requested info count is > 1
Expand Down Expand Up @@ -105,7 +152,7 @@ public static void Handle(Packet packet)
packet.Sender.Send(ack.CreatePacket());
*/

// Old leaked Server sends also BS_PktStickerInfoRes
}

Expand Down
11 changes: 10 additions & 1 deletion src/Shared/Models/AccountModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public static User GetUser(DbDataReader reader)
user.CreateIp = reader["CreateIP"] as string;
user.ActiveCharacterId = Convert.ToUInt64(reader["LastActiveChar"]);
user.BanValidUntil = Convert.ToInt64(reader["BanValidUntil"]);
user.VehicleSerial = Convert.ToUInt16(reader["VehicleSerial"]);
return user;
}

Expand Down Expand Up @@ -168,10 +169,18 @@ public static bool AccountExists(MySqlConnection dbconn, string username)

public static bool UpdateVehicleSerial(MySqlConnection dbconn, ulong userId, ushort serial)
{
using (var mc = new MySqlCommand(
"UPDATE `Users` SET `VehicleSerial` = 0 WHERE `VehicleSerial` = @vehicleSerial",
dbconn))
{
mc.Parameters.AddWithValue("@vehicleSerial", serial);

mc.ExecuteNonQuery();
}

using (var mc = new MySqlCommand("UPDATE `Users` SET `VehicleSerial` = @vehicleSerial WHERE `UID` = @userId",
dbconn))
{
var ticketKey = RandomProvider.Get().NextUInt32();

mc.Parameters.AddWithValue("@userId", userId);
mc.Parameters.AddWithValue("@vehicleSerial", serial);
Expand Down

0 comments on commit 1b1dece

Please sign in to comment.