Random work.

This commit is contained in:
Filip Maj 2016-12-13 15:02:28 -05:00
parent fd2df829de
commit 6c409e93a9
13 changed files with 284 additions and 115 deletions

View File

@ -12,6 +12,10 @@ namespace FFXIVClassic_World_Server.DataObjects
public enum Channel {ZONE, CHAT}; public enum Channel {ZONE, CHAT};
public readonly uint sessionId; public readonly uint sessionId;
public string characterName;
public uint currentZoneId;
public readonly ClientConnection clientConnection; public readonly ClientConnection clientConnection;
public readonly Channel type; public readonly Channel type;
public ZoneServer routing1, routing2; public ZoneServer routing1, routing2;
@ -22,7 +26,8 @@ namespace FFXIVClassic_World_Server.DataObjects
this.clientConnection = connection; this.clientConnection = connection;
this.type = type; this.type = type;
connection.owner = this; connection.owner = this;
Database.LoadZoneSessionInfo(this);
} }
} }
} }

View File

@ -1,9 +1,6 @@
using MySql.Data.MySqlClient; using MySql.Data.MySqlClient;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using FFXIVClassic_World_Server.DataObjects; using FFXIVClassic_World_Server.DataObjects;
using FFXIVClassic_World_Server.DataObjects.Group; using FFXIVClassic_World_Server.DataObjects.Group;
@ -11,6 +8,48 @@ namespace FFXIVClassic_World_Server
{ {
class Database class Database
{ {
public static bool LoadZoneSessionInfo(Session session)
{
string characterName;
uint currentZone = 0;
uint destinationZone = 0;
bool readIn = false;
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
{
try
{
conn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT name, currentZoneId, destinationZoneId FROM characters WHERE id = @charaId", conn);
cmd.Parameters.AddWithValue("@charaId", session.sessionId);
using (MySqlDataReader Reader = cmd.ExecuteReader())
{
while (Reader.Read())
{
characterName = Reader.GetString("name");
currentZone = Reader.GetUInt32("currentZoneId");
destinationZone = Reader.GetUInt32("destinationZoneId");
session.characterName = characterName;
session.currentZoneId = currentZone;
readIn = true;
}
}
}
catch (MySqlException e)
{
Program.Log.Error(e.ToString());
}
finally
{
conn.Dispose();
}
}
return readIn;
}
public static uint GetCurrentZoneForSession(uint charId) public static uint GetCurrentZoneForSession(uint charId)
{ {
uint currentZone = 0; uint currentZone = 0;
@ -50,7 +89,7 @@ namespace FFXIVClassic_World_Server
{ {
return 0; return 0;
} }
} }
public static Dictionary<uint, RetainerGroupMember> GetRetainers(uint charaId) public static Dictionary<uint, RetainerGroupMember> GetRetainers(uint charaId)
{ {

View File

@ -82,8 +82,11 @@
<Compile Include="Packets\Send\_0x2Packet.cs" /> <Compile Include="Packets\Send\_0x2Packet.cs" />
<Compile Include="Packets\Send\_0x7Packet.cs" /> <Compile Include="Packets\Send\_0x7Packet.cs" />
<Compile Include="Packets\Send\_0x8PingPacket.cs" /> <Compile Include="Packets\Send\_0x8PingPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\GroupControlCreateModifyPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\ModifyLinkshellPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\GroupControlGetDeletePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\CreateRelationPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\CreateLinkshellPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\GetGroupPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\DeleteGroupPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\GroupMemberChangePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\GroupMemberChangePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\SessionBeginConfirmPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\SessionBeginConfirmPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\WorldRequestZoneChangePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\WorldRequestZoneChangePacket.cs" />

View File

@ -50,7 +50,7 @@ namespace FFXIVClassic_World_Server
} }
//Creates a new linkshell and adds it to the list //Creates a new linkshell and adds it to the list
public bool DeleteLinkshell(uint groupInstanceId) public bool DeleteLinkshell(ulong groupInstanceId)
{ {
if (mCurrentWorldGroupsReference.ContainsKey(groupInstanceId)) if (mCurrentWorldGroupsReference.ContainsKey(groupInstanceId))
{ {

View File

@ -110,6 +110,7 @@ namespace FFXIVClassic_World_Server
//Check destination, if != 0, update route and start new session //Check destination, if != 0, update route and start new session
if (endConfirmPacket.destinationZone != 0) if (endConfirmPacket.destinationZone != 0)
{ {
session.currentZoneId = endConfirmPacket.destinationZone;
session.routing1 = Server.GetServer().GetWorldManager().GetZoneServer(endConfirmPacket.destinationZone); session.routing1 = Server.GetServer().GetWorldManager().GetZoneServer(endConfirmPacket.destinationZone);
session.routing1.SendSessionStart(session); session.routing1.SendSessionStart(session);
} }
@ -122,7 +123,7 @@ namespace FFXIVClassic_World_Server
else else
Program.Log.Error("Session {0} had an error ending session.", endConfirmPacket.sessionId); Program.Log.Error("Session {0} had an error ending session.", endConfirmPacket.sessionId);
break; break;
//Zone Change Request //Zone Change Request
case 0x1002: case 0x1002:
WorldRequestZoneChangePacket zoneChangePacket = new WorldRequestZoneChangePacket(packet.data); WorldRequestZoneChangePacket zoneChangePacket = new WorldRequestZoneChangePacket(packet.data);

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class CreateLinkshellPacket
{
public bool invalidPacket = false;
public string name;
public ushort crestid;
public uint master;
public CreateLinkshellPacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
crestid = binReader.ReadUInt16();
master = binReader.ReadUInt32();
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class CreateRelationPacket
{
public bool invalidPacket = false;
public uint host;
public uint guest;
public uint command;
public CreateRelationPacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
host = binReader.ReadUInt32();
guest = binReader.ReadUInt32();
command = binReader.ReadUInt32();
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -3,16 +3,12 @@ using System.IO;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{ {
class GroupControlGetDeletePacket class DeleteGroupPacket
{ {
public const byte GROUP_CONTROL_GET = 0; public bool invalidPacket = false;
public const byte GROUP_CONTROL_DELETE = 1;
public bool invalidPacket = false;
public uint controlCode;
public ulong groupId; public ulong groupId;
public GroupControlGetDeletePacket(byte[] data) public DeleteGroupPacket(byte[] data)
{ {
using (MemoryStream mem = new MemoryStream(data)) using (MemoryStream mem = new MemoryStream(data))
{ {
@ -20,7 +16,6 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{ {
try try
{ {
controlCode = binReader.ReadUInt32();
groupId = binReader.ReadUInt64(); groupId = binReader.ReadUInt64();
} }
catch (Exception) catch (Exception)

View File

@ -0,0 +1,29 @@
using System;
using System.IO;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class GetGroupPacket
{
public bool invalidPacket = false;
public ulong groupId;
public GetGroupPacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
groupId = binReader.ReadUInt64();
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -1,43 +0,0 @@
using System;
using System.IO;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class GroupControlCreateModifyPacket
{
public const byte GROUP_CONTROL_CREATE = 0;
public const byte GROUP_CONTROL_MODIFY = 1;
public const byte GROUP_PARTY = 0;
public const byte GROUP_RETAINER = 1;
public const byte GROUP_LINKSHELL = 2;
public const byte GROUP_RELATION = 3;
public bool invalidPacket = false;
public byte controlCode;
public ulong groupId;
public byte groupType;
public GroupControlCreateModifyPacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
controlCode = binReader.ReadByte();
groupType = binReader.ReadByte();
groupId = binReader.ReadUInt64();
//Work value data
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -0,0 +1,47 @@
using System;
using System.IO;
using System.Text;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{
class ModifyLinkshellPacket
{
public bool invalidPacket = false;
public ushort argCode;
public string name;
public ushort crestid;
public uint master;
public ModifyLinkshellPacket(byte[] data)
{
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryReader binReader = new BinaryReader(mem))
{
try
{
argCode = binReader.ReadUInt16();
switch (argCode)
{
case 0:
name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
break;
case 1:
crestid = binReader.ReadUInt16();
break;
case 2:
master = binReader.ReadUInt32();
break;
}
}
catch (Exception)
{
invalidPacket = true;
}
}
}
}
}
}

View File

@ -204,60 +204,25 @@ namespace FFXIVClassic_World_Server
} }
break; break;
//Group Control Create or Modify //Group get data request
case 0x1020: case 0x1020:
GroupControlCreateModifyPacket gCreateModifyPacket = new GroupControlCreateModifyPacket(subpacket.data); GetGroupPacket getGroupPacket = new GetGroupPacket(subpacket.data);
SendGroupData(session, getGroupPacket.groupId);
if (gCreateModifyPacket.controlCode == GroupControlCreateModifyPacket.GROUP_CONTROL_CREATE)
{
ulong groupId;
switch (gCreateModifyPacket.groupType)
{
case GroupControlCreateModifyPacket.GROUP_PARTY:
//mPartyManager.CreateParty();
break;
case GroupControlCreateModifyPacket.GROUP_RETAINER:
//mPartyManager.CreateParty();
break;
case GroupControlCreateModifyPacket.GROUP_LINKSHELL:
//mPartyManager.CreateParty();
break;
case GroupControlCreateModifyPacket.GROUP_RELATION:
//mPartyManager.CreateParty();
break;
}
}
else if (gCreateModifyPacket.controlCode == GroupControlCreateModifyPacket.GROUP_CONTROL_MODIFY)
{
switch (gCreateModifyPacket.groupType)
{
case GroupControlCreateModifyPacket.GROUP_PARTY:
//mPartyManager.CreateParty();
break;
case GroupControlCreateModifyPacket.GROUP_RETAINER:
//mPartyManager.CreateParty();
break;
case GroupControlCreateModifyPacket.GROUP_LINKSHELL:
//mPartyManager.CreateParty();
break;
case GroupControlCreateModifyPacket.GROUP_RELATION:
//mPartyManager.CreateParty();
break;
}
}
break; break;
//Group Control Get or Delete //Group delete request
case 0x1021: case 0x1021:
GroupControlGetDeletePacket gGetDeletePacket = new GroupControlGetDeletePacket(subpacket.data); DeleteGroupPacket deleteGroupPacket = new DeleteGroupPacket(subpacket.data);
if (gGetDeletePacket.controlCode == GroupControlGetDeletePacket.GROUP_CONTROL_GET) DeleteGroup(deleteGroupPacket.groupId);
{ break;
//Linkshell create request
} case 0x1023:
else if (gGetDeletePacket.controlCode == GroupControlGetDeletePacket.GROUP_CONTROL_DELETE) CreateLinkshellPacket createLinkshellpacket = new CreateLinkshellPacket(subpacket.data);
{ mLinkshellManager.CreateLinkshell(createLinkshellpacket.name, createLinkshellpacket.crestid, createLinkshellpacket.master);
break;
} //Linkshell modify request
case 0x1024:
ModifyLinkshellPacket modifyLinkshellpacket = new ModifyLinkshellPacket(subpacket.data);
mLinkshellManager.ModifyLinkshell();
break; break;
//Group Add/Remove Member //Group Add/Remove Member
case 0x1022: case 0x1022:
@ -265,8 +230,7 @@ namespace FFXIVClassic_World_Server
break; break;
} }
} }
else if (mZoneSessionList.ContainsKey(sessionId))
if (mZoneSessionList.ContainsKey(sessionId))
{ {
ClientConnection conn = mZoneSessionList[sessionId].clientConnection; ClientConnection conn = mZoneSessionList[sessionId].clientConnection;
conn.QueuePacket(subpacket, true, false); conn.QueuePacket(subpacket, true, false);
@ -410,7 +374,58 @@ namespace FFXIVClassic_World_Server
} }
} }
#endregion #endregion
private void SendGroupData(Session session, ulong groupId)
{
if (mCurrentWorldGroups.ContainsKey(groupId))
{
Group group = mCurrentWorldGroups[groupId];
}
}
private void SendGroupDataToAllMembers(ulong groupId)
{
if (mCurrentWorldGroups.ContainsKey(groupId))
{
Group group = mCurrentWorldGroups[groupId];
}
}
public void GetGroup(Group group)
{
if (group is Party)
{
}
else if (group is RetainerGroup)
{
}
else if (group is Linkshell)
{
}
else if (group is Relation)
{
}
}
public void DeleteGroup(ulong id)
{
if (!mCurrentWorldGroups.ContainsKey(id))
return;
Group group = mCurrentWorldGroups[id];
if (group is Party)
mPartyManager.DeleteParty(group.groupIndex);
else if (group is Linkshell)
mLinkshellManager.DeleteLinkshell(group.groupIndex);
else if (group is Relation)
mRelationGroupManager.DeleteRelationGroup(group.groupIndex);
}
public void IncrementGroupIndex() public void IncrementGroupIndex()
{ {

View File

@ -173,6 +173,12 @@ namespace FFXIVClassic_World_Server
if (zs == null) if (zs == null)
return; return;
session.currentZoneId = destinationZoneId;
//Intrazone change, just update the id
if (zs.Equals(session.routing1))
return;
if (zs.isConnected) if (zs.isConnected)
session.routing1.SendSessionEnd(session, destinationZoneId, destinationPrivateArea, spawnType, spawnX, spawnY, spawnZ, spawnRotation); session.routing1.SendSessionEnd(session, destinationZoneId, destinationPrivateArea, spawnType, spawnX, spawnY, spawnZ, spawnRotation);
else if (zs.Connect()) else if (zs.Connect())
@ -184,7 +190,7 @@ namespace FFXIVClassic_World_Server
//Login Zone In //Login Zone In
public void DoLogin(Session session) public void DoLogin(Session session)
{ {
session.routing1 = GetZoneServer(Database.GetCurrentZoneForSession(session.sessionId)); session.routing1 = GetZoneServer(session.currentZoneId);
session.routing1.SendSessionStart(session); session.routing1.SendSessionStart(session);
} }