mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-04-24 13:47:46 +00:00
Redid the initial handshake code to handle the found connection type field. Server should no longer create two player objects and code has been reduced. Removed instances of connection1/2 getters... server simply sends packets down zone connection. Fixed issue with world manager not zoning in player due to missing 0x2 packet.
This commit is contained in:
parent
093d3b7c15
commit
d90dc0cb80
7 changed files with 102 additions and 127 deletions
|
@ -56,10 +56,6 @@ namespace FFXIVClassic_Lobby_Server
|
|||
|
||||
public void processPacket(ClientConnection client, BasePacket packet)
|
||||
{
|
||||
ConnectedPlayer player = null;
|
||||
if (client.owner != 0 && mPlayers.ContainsKey(client.owner))
|
||||
player = mPlayers[client.owner];
|
||||
|
||||
if (packet.header.isCompressed == 0x01)
|
||||
BasePacket.decryptPacket(client.blowfish, ref packet);
|
||||
|
||||
|
@ -80,6 +76,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||
BasePacket reply1 = new BasePacket(reply1Data);
|
||||
BasePacket reply2 = new BasePacket("./packets/login/login2.bin");
|
||||
|
||||
//Write Timestamp into Reply1
|
||||
using (MemoryStream mem = new MemoryStream(reply1.data))
|
||||
{
|
||||
using (BinaryWriter binReader = new BinaryWriter(mem))
|
||||
|
@ -89,23 +86,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
//Already Handshaked
|
||||
if (client.owner != 0)
|
||||
{
|
||||
using (MemoryStream mem = new MemoryStream(reply2.data))
|
||||
{
|
||||
using (BinaryWriter binReader = new BinaryWriter(mem))
|
||||
{
|
||||
binReader.BaseStream.Seek(0x10, SeekOrigin.Begin);
|
||||
binReader.Write(player.actorID);
|
||||
}
|
||||
}
|
||||
|
||||
client.queuePacket(reply1);
|
||||
client.queuePacket(reply2);
|
||||
break;
|
||||
}
|
||||
|
||||
//Read in Actor Id that owns this connection
|
||||
uint actorID = 0;
|
||||
using (MemoryStream mem = new MemoryStream(packet.data))
|
||||
{
|
||||
|
@ -123,9 +104,13 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
//Should never happen.... unless actor id IS 0!
|
||||
if (actorID == 0)
|
||||
break;
|
||||
|
||||
client.owner = actorID;
|
||||
|
||||
//Write Actor ID into reply2
|
||||
using (MemoryStream mem = new MemoryStream(reply2.data))
|
||||
{
|
||||
using (BinaryWriter binReader = new BinaryWriter(mem))
|
||||
|
@ -135,23 +120,29 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
if (((IPEndPoint)client.socket.LocalEndPoint).Port == 54992)
|
||||
ConnectedPlayer player = null;
|
||||
|
||||
if (packet.header.connectionType == BasePacket.TYPE_ZONE)
|
||||
{
|
||||
while (!mPlayers.ContainsKey(client.owner))
|
||||
{ }
|
||||
player = mPlayers[client.owner];
|
||||
}
|
||||
|
||||
//Create connected player if not created
|
||||
if (player == null)
|
||||
{
|
||||
player = new ConnectedPlayer(actorID);
|
||||
mPlayers[actorID] = player;
|
||||
client.owner = actorID;
|
||||
client.connType = 0;
|
||||
player.setConnection1(client);
|
||||
Log.debug(String.Format("Got actorID {0} for conn {1}.", actorID, client.getAddress()));
|
||||
}
|
||||
else
|
||||
{
|
||||
client.owner = actorID;
|
||||
client.connType = 1;
|
||||
player.setConnection2(client);
|
||||
}
|
||||
|
||||
//Get Character info
|
||||
player.setConnection(packet.header.connectionType, client);
|
||||
|
||||
if (packet.header.connectionType == BasePacket.TYPE_ZONE)
|
||||
Log.debug(String.Format("Got {0} connection for ActorID {1} @ {2}.", "zone", actorID, client.getAddress()));
|
||||
else if (packet.header.connectionType == BasePacket.TYPE_CHAT)
|
||||
Log.debug(String.Format("Got {0} connection for ActorID {1} @ {2}.", "chat", actorID, client.getAddress()));
|
||||
|
||||
//Create player actor
|
||||
reply1.debugPrintPacket();
|
||||
client.queuePacket(reply1);
|
||||
|
@ -172,6 +163,8 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
else if (subpacket.header.type == 0x03)
|
||||
{
|
||||
ConnectedPlayer player = mPlayers[client.owner];
|
||||
|
||||
//Normal Game Opcode
|
||||
switch (subpacket.gameMessage.opcode)
|
||||
{
|
||||
|
@ -357,17 +350,14 @@ namespace FFXIVClassic_Lobby_Server
|
|||
}
|
||||
}
|
||||
|
||||
public void sendPacket(string path, int conn)
|
||||
public void sendPacket(string path)
|
||||
{
|
||||
BasePacket packet = new BasePacket(path);
|
||||
|
||||
foreach (KeyValuePair<uint, ConnectedPlayer> entry in mPlayers)
|
||||
{
|
||||
packet.replaceActorID(entry.Value.actorID);
|
||||
if (conn == 1 || conn == 3)
|
||||
entry.Value.getConnection1().queuePacket(packet);
|
||||
if (conn == 2 || conn == 3)
|
||||
entry.Value.getConnection2().queuePacket(packet);
|
||||
entry.Value.queuePacket(packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -438,10 +428,8 @@ namespace FFXIVClassic_Lobby_Server
|
|||
packet.replaceActorID(entry.Value.actorID);
|
||||
actorPacket.replaceActorID(entry.Value.actorID);
|
||||
|
||||
entry.Value.getConnection1().queuePacket(packet);
|
||||
entry.Value.getConnection1().queuePacket(actorPacket);
|
||||
|
||||
|
||||
entry.Value.queuePacket(packet);
|
||||
entry.Value.queuePacket(actorPacket);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -74,19 +74,23 @@ namespace FFXIVClassic_Lobby_Server
|
|||
String input = Console.ReadLine();
|
||||
String[] split = input.Split(' ');
|
||||
|
||||
if (split.Length >= 3)
|
||||
if (split.Length >= 2)
|
||||
{
|
||||
if (split[0].Equals("sendpacket"))
|
||||
{
|
||||
try{
|
||||
server.sendPacket("./packets/" + split[1], Int32.Parse(split[2]));
|
||||
try
|
||||
{
|
||||
server.sendPacket("./packets/" + split[1]);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.error("Could not load packet: " + e);
|
||||
}
|
||||
}
|
||||
else if (split[0].Equals("warp"))
|
||||
}
|
||||
else if (split.Length >= 3)
|
||||
{
|
||||
if (split[0].Equals("warp"))
|
||||
{
|
||||
server.doWarp(split[1], split[2], split[3], split[4]);
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||
#region Socket Handling
|
||||
public bool startServer()
|
||||
{
|
||||
mWorldManager = new WorldManager();
|
||||
mWorldManager = new WorldManager(this);
|
||||
mWorldManager.LoadZoneList();
|
||||
|
||||
IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), FFXIV_MAP_PORT);
|
||||
|
@ -226,9 +226,9 @@ namespace FFXIVClassic_Lobby_Server
|
|||
|
||||
#endregion
|
||||
|
||||
public void sendPacket(string path, int conn)
|
||||
public void sendPacket(string path)
|
||||
{
|
||||
mProcessor.sendPacket(path, conn);
|
||||
mProcessor.sendPacket(path);
|
||||
}
|
||||
|
||||
public void testCodePacket(uint id, uint value, string target)
|
||||
|
@ -245,14 +245,8 @@ namespace FFXIVClassic_Lobby_Server
|
|||
|
||||
BasePacket packet = BasePacket.createPacket(changePropertyPacket, true, false);
|
||||
packet.debugPrintPacket();
|
||||
if (entry.Value.getConnection1() != null)
|
||||
entry.Value.getConnection1().queuePacket(packet);
|
||||
else
|
||||
Log.error("Connection was null");
|
||||
if (entry.Value.getConnection2() != null)
|
||||
entry.Value.getConnection2().queuePacket(packet);
|
||||
else
|
||||
Log.error("Connection was null");
|
||||
|
||||
entry.Value.queuePacket(packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -268,8 +262,7 @@ namespace FFXIVClassic_Lobby_Server
|
|||
SubPacket changePropertyPacket = changeProperty.buildPacket((entry.Value.actorID), (entry.Value.actorID));
|
||||
BasePacket packet = BasePacket.createPacket(changePropertyPacket, true, false);
|
||||
packet.debugPrintPacket();
|
||||
entry.Value.getConnection1().queuePacket(packet);
|
||||
entry.Value.getConnection2().queuePacket(packet);
|
||||
entry.Value.queuePacket(packet);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -6,6 +6,7 @@ using FFXIVClassic_Map_Server.packets.send;
|
|||
using FFXIVClassic_Map_Server.packets.send.actor;
|
||||
using FFXIVClassic_Map_Server.packets.send.Actor.inventory;
|
||||
using FFXIVClassic_Map_Server.packets.send.list;
|
||||
using FFXIVClassic_Map_Server.packets.send.login;
|
||||
using FFXIVClassic_Map_Server.packets.send.player;
|
||||
using FFXIVClassic_Map_Server.utils;
|
||||
using MySql.Data.MySqlClient;
|
||||
|
@ -61,8 +62,11 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||
|
||||
public PlayerWork playerWork = new PlayerWork();
|
||||
|
||||
public Player(uint actorID) : base(actorID)
|
||||
public ConnectedPlayer playerSession;
|
||||
|
||||
public Player(ConnectedPlayer cp, uint actorID) : base(actorID)
|
||||
{
|
||||
playerSession = cp;
|
||||
actorName = String.Format("_pc{0:00000000}", actorID);
|
||||
className = "Player";
|
||||
currentSubState = SetActorStatePacket.SUB_STATE_PLAYER;
|
||||
|
@ -361,13 +365,12 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||
|
||||
public void sendZoneInPackets(WorldManager world)
|
||||
{
|
||||
ClientConnection client;
|
||||
client.queuePacket(SetMapPacket.buildPacket(actorId, zone.regionId, zone.actorId), true, false);
|
||||
//client.queuePacket(_0x2Packet.buildPacket(player.actorID), true, false);
|
||||
client.queuePacket(SetMusicPacket.buildPacket(actorId, 0x3D, 0x01), true, false);
|
||||
client.queuePacket(SetWeatherPacket.buildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR), true, false);
|
||||
playerSession.queuePacket(SetMapPacket.buildPacket(actorId, zone.regionId, zone.actorId), true, false);
|
||||
playerSession.queuePacket(_0x2Packet.buildPacket(actorId), true, false);
|
||||
playerSession.queuePacket(SetMusicPacket.buildPacket(actorId, 0x3D, 0x01), true, false);
|
||||
playerSession.queuePacket(SetWeatherPacket.buildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR), true, false);
|
||||
|
||||
client.queuePacket(getSpawnPackets(actorId));
|
||||
playerSession.queuePacket(getSpawnPackets(actorId));
|
||||
|
||||
#region grouptest
|
||||
//Retainers
|
||||
|
@ -377,19 +380,19 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||
retainerListEntries.Add(new ListEntry(0x24, 0x0, 0xFFFFFFFF, false, false, "TEST2"));
|
||||
retainerListEntries.Add(new ListEntry(0x25, 0x0, 0xFFFFFFFF, false, false, "TEST3"));
|
||||
BasePacket retainerListPacket = BasePacket.createPacket(ListUtils.createRetainerList(actorId, 0xF4, 1, 0x800000000004e639, retainerListEntries), true, false);
|
||||
client.queuePacket(retainerListPacket);
|
||||
playerSession.queuePacket(retainerListPacket);
|
||||
|
||||
//Party
|
||||
List<ListEntry> partyListEntries = new List<ListEntry>();
|
||||
partyListEntries.Add(new ListEntry(actorId, 0xFFFFFFFF, 0xFFFFFFFF, false, true, customDisplayName));
|
||||
partyListEntries.Add(new ListEntry(0x029B27D3, 0xFFFFFFFF, 0x195, false, true, "Valentine Bluefeather"));
|
||||
BasePacket partyListPacket = BasePacket.createPacket(ListUtils.createPartyList(actorId, 0xF4, 1, 0x8000000000696df2, partyListEntries), true, false);
|
||||
client.queuePacket(partyListPacket);
|
||||
playerSession.queuePacket(partyListPacket);
|
||||
#endregion
|
||||
|
||||
#region itemsetup
|
||||
////////ITEMS////////
|
||||
client.queuePacket(InventoryBeginChangePacket.buildPacket(actorId), true, false);
|
||||
playerSession.queuePacket(InventoryBeginChangePacket.buildPacket(actorId), true, false);
|
||||
|
||||
|
||||
//TEST
|
||||
|
@ -433,7 +436,7 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||
|
||||
#endregion
|
||||
#region equipsetup
|
||||
client.queuePacket(BasePacket.createPacket(setinvPackets, true, false));
|
||||
playerSession.queuePacket(BasePacket.createPacket(setinvPackets, true, false));
|
||||
EquipmentSetupPacket initialEqupmentPacket = new EquipmentSetupPacket();
|
||||
initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_BODY, 5);
|
||||
initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_HEAD, 3);
|
||||
|
@ -443,23 +446,23 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||
initialEqupmentPacket.setItem(EquipmentSetupPacket.SLOT_LEGS, 8);
|
||||
|
||||
//Equip Init
|
||||
client.queuePacket(InventorySetBeginPacket.buildPacket(actorId, 0x23, InventorySetBeginPacket.CODE_EQUIPMENT), true, false);
|
||||
client.queuePacket(BasePacket.createPacket(initialEqupmentPacket.buildPackets(actorId), true, false));
|
||||
client.queuePacket(InventorySetEndPacket.buildPacket(actorId), true, false);
|
||||
playerSession.queuePacket(InventorySetBeginPacket.buildPacket(actorId, 0x23, InventorySetBeginPacket.CODE_EQUIPMENT), true, false);
|
||||
playerSession.queuePacket(BasePacket.createPacket(initialEqupmentPacket.buildPackets(actorId), true, false));
|
||||
playerSession.queuePacket(InventorySetEndPacket.buildPacket(actorId), true, false);
|
||||
|
||||
client.queuePacket(InventoryEndChangePacket.buildPacket(actorId), true, false);
|
||||
playerSession.queuePacket(InventoryEndChangePacket.buildPacket(actorId), true, false);
|
||||
////////ITEMS////////
|
||||
|
||||
#endregion
|
||||
|
||||
client.queuePacket(getInitPackets(actorId));
|
||||
playerSession.queuePacket(getInitPackets(actorId));
|
||||
|
||||
BasePacket innSpawn = zone.getSpawnPackets(actorId);
|
||||
BasePacket debugSpawn = world.GetDebugActor().getSpawnPackets(actorId);
|
||||
BasePacket worldMasterSpawn = world.GetActor().getSpawnPackets(actorId);
|
||||
client.queuePacket(innSpawn);
|
||||
client.queuePacket(debugSpawn);
|
||||
client.queuePacket(worldMasterSpawn);
|
||||
playerSession.queuePacket(innSpawn);
|
||||
playerSession.queuePacket(debugSpawn);
|
||||
playerSession.queuePacket(worldMasterSpawn);
|
||||
|
||||
#region hardcode
|
||||
BasePacket reply9 = new BasePacket("./packets/login/login9_zonesetup.bin"); //Bed, Book created
|
||||
|
@ -468,9 +471,9 @@ namespace FFXIVClassic_Map_Server.dataobjects.chara
|
|||
reply9.replaceActorID(actorId);
|
||||
reply10.replaceActorID(actorId);
|
||||
reply11.replaceActorID(actorId);
|
||||
client.queuePacket(reply9);
|
||||
client.queuePacket(reply10);
|
||||
client.queuePacket(reply11);
|
||||
playerSession.queuePacket(reply9);
|
||||
playerSession.queuePacket(reply10);
|
||||
playerSession.queuePacket(reply11);
|
||||
#endregion
|
||||
|
||||
}
|
||||
|
|
|
@ -19,68 +19,51 @@ namespace FFXIVClassic_Map_Server.dataobjects
|
|||
public uint eventCurrentOwner = 0;
|
||||
public string eventCurrentStarter = "";
|
||||
|
||||
ClientConnection conn1;
|
||||
ClientConnection conn2;
|
||||
private ClientConnection zoneConnection;
|
||||
private ClientConnection chatConnection;
|
||||
|
||||
bool isDisconnected;
|
||||
|
||||
public ConnectedPlayer(uint actorId)
|
||||
{
|
||||
this.actorID = actorId;
|
||||
playerActor = new Player(actorId);
|
||||
playerActor = new Player(this, actorId);
|
||||
actorInstanceList.Add(playerActor);
|
||||
}
|
||||
|
||||
public void addConnection(ClientConnection conn)
|
||||
public void setConnection(int type, ClientConnection conn)
|
||||
{
|
||||
if (conn1 == null && conn2 != null)
|
||||
conn1 = conn;
|
||||
else if (conn2 == null && conn1 != null)
|
||||
conn2 = conn;
|
||||
else
|
||||
conn1 = conn;
|
||||
switch (type)
|
||||
{
|
||||
case BasePacket.TYPE_ZONE:
|
||||
zoneConnection = conn;
|
||||
break;
|
||||
case BasePacket.TYPE_CHAT:
|
||||
chatConnection = conn;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public bool isClientConnectionsReady()
|
||||
{
|
||||
return (conn1 != null && conn2 != null);
|
||||
return (zoneConnection != null && chatConnection != null);
|
||||
}
|
||||
|
||||
public void disconnect()
|
||||
{
|
||||
isDisconnected = true;
|
||||
conn1.disconnect();
|
||||
conn2.disconnect();
|
||||
}
|
||||
|
||||
public void setConnection1(ClientConnection conn)
|
||||
{
|
||||
conn1 = conn;
|
||||
}
|
||||
|
||||
public void setConnection2(ClientConnection conn)
|
||||
{
|
||||
conn2 = conn;
|
||||
}
|
||||
|
||||
public ClientConnection getConnection1()
|
||||
{
|
||||
return conn1;
|
||||
}
|
||||
|
||||
public ClientConnection getConnection2()
|
||||
{
|
||||
return conn2;
|
||||
zoneConnection.disconnect();
|
||||
chatConnection.disconnect();
|
||||
}
|
||||
|
||||
public void queuePacket(BasePacket basePacket)
|
||||
{
|
||||
conn1.queuePacket(basePacket);
|
||||
zoneConnection.queuePacket(basePacket);
|
||||
}
|
||||
|
||||
public void queuePacket(SubPacket subPacket, bool isAuthed, bool isEncrypted)
|
||||
{
|
||||
conn1.queuePacket(subPacket, isAuthed, isEncrypted);
|
||||
zoneConnection.queuePacket(subPacket, isAuthed, isEncrypted);
|
||||
}
|
||||
|
||||
public Player getActor()
|
||||
|
|
|
@ -62,12 +62,12 @@ namespace FFXIVClassic_Map_Server.lua
|
|||
public void runEvent(string functionName, params object[] parameters)
|
||||
{
|
||||
List<LuaParam> lParams = LuaUtils.createLuaParamList(parameters);
|
||||
player.getConnection1().queuePacket(RunEventFunctionPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter, functionName, lParams), true, false);
|
||||
player.queuePacket(RunEventFunctionPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter, functionName, lParams), true, false);
|
||||
}
|
||||
|
||||
public void endEvent()
|
||||
{
|
||||
player.getConnection1().queuePacket(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter), true, false);
|
||||
player.queuePacket(EndEventPacket.buildPacket(player.actorID, player.eventCurrentOwner, player.eventCurrentStarter), true, false);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -10,18 +10,22 @@ using System.IO;
|
|||
|
||||
namespace FFXIVClassic_Lobby_Server.packets
|
||||
{
|
||||
|
||||
[StructLayout(LayoutKind.Sequential)]
|
||||
public struct BasePacketHeader
|
||||
{
|
||||
public byte isAuthenticated;
|
||||
public byte isCompressed;
|
||||
public ushort reserved;
|
||||
public ushort connectionType;
|
||||
public ushort packetSize;
|
||||
public ushort numSubpackets;
|
||||
public ulong timestamp; //Miliseconds
|
||||
}
|
||||
|
||||
public class BasePacket{
|
||||
|
||||
public const int TYPE_ZONE = 1;
|
||||
public const int TYPE_CHAT = 2;
|
||||
public const int BASEPACKET_SIZE = 0x10;
|
||||
|
||||
public BasePacketHeader header;
|
||||
|
|
Loading…
Add table
Reference in a new issue