mirror of
https://bitbucket.org/Ioncannon/project-meteor-server.git
synced 2025-05-20 08:26:59 -04:00
Zone server now uses the World server's group classes. MotD now shows proper world name. Added party functions to zone server.
This commit is contained in:
@@ -10,12 +10,15 @@ namespace FFXIVClassic_World_Server
|
||||
public static String OPTIONS_PORT;
|
||||
public static bool OPTIONS_TIMESTAMP = false;
|
||||
|
||||
public static uint DATABASE_WORLDID;
|
||||
public static String DATABASE_HOST;
|
||||
public static String DATABASE_PORT;
|
||||
public static String DATABASE_NAME;
|
||||
public static String DATABASE_USERNAME;
|
||||
public static String DATABASE_PASSWORD;
|
||||
|
||||
public static String PREF_SERVERNAME;
|
||||
|
||||
public static bool Load()
|
||||
{
|
||||
Program.Log.Info("Loading world_config.ini");
|
||||
@@ -32,6 +35,7 @@ namespace FFXIVClassic_World_Server
|
||||
ConfigConstants.OPTIONS_PORT = configIni.GetValue("General", "server_port", "54992");
|
||||
ConfigConstants.OPTIONS_TIMESTAMP = configIni.GetValue("General", "showtimestamp", "true").ToLower().Equals("true");
|
||||
|
||||
ConfigConstants.DATABASE_WORLDID = UInt32.Parse(configIni.GetValue("Database", "worldid", "0"));
|
||||
ConfigConstants.DATABASE_HOST = configIni.GetValue("Database", "host", "");
|
||||
ConfigConstants.DATABASE_PORT = configIni.GetValue("Database", "port", "");
|
||||
ConfigConstants.DATABASE_NAME = configIni.GetValue("Database", "database", "");
|
||||
|
14
FFXIVClassic World Server/DataObjects/DBWorld.cs
Normal file
14
FFXIVClassic World Server/DataObjects/DBWorld.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
namespace FFXIVClassic_World_Server.DataObjects
|
||||
{
|
||||
class DBWorld
|
||||
{
|
||||
public uint id;
|
||||
public string address;
|
||||
public ushort port;
|
||||
public ushort listPosition;
|
||||
public ushort population;
|
||||
public string name;
|
||||
public bool isActive;
|
||||
public string motd;
|
||||
}
|
||||
}
|
@@ -8,6 +8,41 @@ namespace FFXIVClassic_World_Server
|
||||
{
|
||||
class Database
|
||||
{
|
||||
public static DBWorld GetServer(uint serverId)
|
||||
{
|
||||
using (var 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)))
|
||||
{
|
||||
DBWorld world = null;
|
||||
try
|
||||
{
|
||||
conn.Open();
|
||||
MySqlCommand cmd = new MySqlCommand("SELECT name, address, port FROM servers WHERE id = @serverId", conn);
|
||||
cmd.Parameters.AddWithValue("@serverId", serverId);
|
||||
using (MySqlDataReader Reader = cmd.ExecuteReader())
|
||||
{
|
||||
while (Reader.Read())
|
||||
{
|
||||
world = new DBWorld();
|
||||
world.id = serverId;
|
||||
world.name = Reader.GetString("name");
|
||||
world.address = Reader.GetString("address");
|
||||
world.port = Reader.GetUInt16("port");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (MySqlException e)
|
||||
{
|
||||
Program.Log.Error(e.ToString());
|
||||
}
|
||||
finally
|
||||
{
|
||||
conn.Dispose();
|
||||
}
|
||||
|
||||
return world;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool LoadZoneSessionInfo(Session session)
|
||||
{
|
||||
string characterName;
|
||||
|
@@ -75,6 +75,7 @@
|
||||
<Compile Include="ConfigConstants.cs" />
|
||||
<Compile Include="Database.cs" />
|
||||
<Compile Include="DataObjects\ClientConnection.cs" />
|
||||
<Compile Include="DataObjects\DBWorld.cs" />
|
||||
<Compile Include="DataObjects\Group\Group.cs" />
|
||||
<Compile Include="DataObjects\Group\Linkshell.cs" />
|
||||
<Compile Include="DataObjects\Group\LinkshellMember.cs" />
|
||||
@@ -115,6 +116,7 @@
|
||||
<Compile Include="Packets\WorldPackets\Receive\WorldRequestZoneChangePacket.cs" />
|
||||
<Compile Include="Packets\WorldPackets\Receive\SessionEndConfirmPacket.cs" />
|
||||
<Compile Include="Packets\WorldPackets\Send\ErrorPacket.cs" />
|
||||
<Compile Include="Packets\WorldPackets\Send\Group\PartySyncPacket.cs" />
|
||||
<Compile Include="Packets\WorldPackets\Send\Group\GroupWorkValuesPacket.cs" />
|
||||
<Compile Include="Packets\WorldPackets\Send\Group\GroupMemberListPacket.cs" />
|
||||
<Compile Include="Packets\WorldPackets\Send\Group\GroupMemberListEndPacket.cs" />
|
||||
|
@@ -160,7 +160,7 @@ namespace FFXIVClassic_World_Server
|
||||
public Linkshell GetLinkshell(string name)
|
||||
{
|
||||
if (mNameToIdLookup.ContainsKey(name))
|
||||
return mCurrentWorldGroupsReference[mNameToIdLookup[name]];
|
||||
return (Linkshell)mCurrentWorldGroupsReference[mNameToIdLookup[name]];
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
@@ -0,0 +1,33 @@
|
||||
using FFXIVClassic.Common;
|
||||
using FFXIVClassic_World_Server.DataObjects;
|
||||
using FFXIVClassic_World_Server.DataObjects.Group;
|
||||
using System;
|
||||
using System.IO;
|
||||
|
||||
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Send.Group
|
||||
{
|
||||
class PartySyncPacket
|
||||
{
|
||||
public const ushort OPCODE = 0x1020;
|
||||
public const uint PACKET_SIZE = 0x60;
|
||||
|
||||
public static SubPacket BuildPacket(Session session, Party party)
|
||||
{
|
||||
byte[] data = new byte[PACKET_SIZE - 0x20];
|
||||
|
||||
using (MemoryStream mem = new MemoryStream(data))
|
||||
{
|
||||
using (BinaryWriter binWriter = new BinaryWriter(mem))
|
||||
{
|
||||
binWriter.Write((UInt64)party.groupIndex);
|
||||
binWriter.Write((UInt32)party.GetLeader());
|
||||
binWriter.Write((UInt32)party.members.Count);
|
||||
for (int i = 0; i < party.members.Count; i++)
|
||||
binWriter.Write((UInt32)party.members[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return new SubPacket(true, OPCODE, 0, session.sessionId, data);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,4 +1,5 @@
|
||||
using MySql.Data.MySqlClient;
|
||||
using FFXIVClassic_World_Server.DataObjects;
|
||||
using MySql.Data.MySqlClient;
|
||||
using NLog;
|
||||
using NLog.Fluent;
|
||||
using System;
|
||||
@@ -56,6 +57,19 @@ namespace FFXIVClassic_World_Server
|
||||
startServer = false;
|
||||
}
|
||||
}
|
||||
|
||||
//Check World ID
|
||||
DBWorld thisWorld = Database.GetServer(ConfigConstants.DATABASE_WORLDID);
|
||||
if (thisWorld != null)
|
||||
{
|
||||
Program.Log.Info("Successfully pulled world info from DB. Server name is {0}.", thisWorld.name);
|
||||
ConfigConstants.PREF_SERVERNAME = thisWorld.name;
|
||||
}
|
||||
else
|
||||
{
|
||||
Program.Log.Info("World info could not be retrieved from the DB. Welcome and MOTD will not be displayed.");
|
||||
ConfigConstants.PREF_SERVERNAME = "Unknown";
|
||||
}
|
||||
|
||||
//Start server if A-OK
|
||||
if (startServer)
|
||||
|
@@ -228,7 +228,7 @@ namespace FFXIVClassic_World_Server
|
||||
//Linkshell set active
|
||||
case 0x1028:
|
||||
SetActiveLinkshellPacket setActiveLinkshellPacket = new SetActiveLinkshellPacket(subpacket.data);
|
||||
Linkshell ls = mWorldManager.GetLinkshellManager().GetLinkshell();
|
||||
//Linkshell ls = mWorldManager.GetLinkshellManager().GetLinkshell();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@@ -4,6 +4,7 @@ using FFXIVClassic_World_Server.DataObjects.Group;
|
||||
using FFXIVClassic_World_Server.Packets.Send.Subpackets;
|
||||
using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups;
|
||||
using FFXIVClassic_World_Server.Packets.WorldPackets.Send;
|
||||
using FFXIVClassic_World_Server.Packets.WorldPackets.Send.Group;
|
||||
using MySql.Data.MySqlClient;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
@@ -219,6 +220,7 @@ namespace FFXIVClassic_World_Server
|
||||
mPartyManager.AddToParty(pt.groupIndex, 161);
|
||||
mPartyManager.AddToParty(pt.groupIndex, 162);
|
||||
pt.SendGroupPackets(session);
|
||||
SendPartySync(pt);
|
||||
mRetainerGroupManager.GetRetainerGroup(session.sessionId).SendGroupPackets(session);
|
||||
List<Linkshell> linkshells = mLinkshellManager.GetPlayerLinkshellMembership(session.sessionId);
|
||||
foreach (Linkshell ls in linkshells)
|
||||
@@ -230,11 +232,23 @@ namespace FFXIVClassic_World_Server
|
||||
private void SendMotD(Session session)
|
||||
{
|
||||
session.clientConnection.QueuePacket(SendMessagePacket.BuildPacket(session.sessionId, session.sessionId, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "-------- Login Message --------"), true, false);
|
||||
session.clientConnection.QueuePacket(SendMessagePacket.BuildPacket(session.sessionId, session.sessionId, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "Welcome to <Server Name>!"), true, false);
|
||||
session.clientConnection.QueuePacket(SendMessagePacket.BuildPacket(session.sessionId, session.sessionId, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", String.Format("Welcome to {0}!", ConfigConstants.PREF_SERVERNAME)), true, false);
|
||||
session.clientConnection.QueuePacket(SendMessagePacket.BuildPacket(session.sessionId, session.sessionId, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "Welcome to Eorzea!"), true, false);
|
||||
session.clientConnection.QueuePacket(SendMessagePacket.BuildPacket(session.sessionId, session.sessionId, SendMessagePacket.MESSAGE_TYPE_GENERAL_INFO, "", "Here is a test Message of the Day from the World Server!"), true, false);
|
||||
}
|
||||
|
||||
public void SendPartySync(Party party)
|
||||
{
|
||||
foreach (uint member in party.members)
|
||||
{
|
||||
Session session = Server.GetServer().GetSession(member);
|
||||
if (session == null)
|
||||
continue;
|
||||
SubPacket syncPacket = PartySyncPacket.BuildPacket(session, party);
|
||||
session.routing1.SendPacket(syncPacket);
|
||||
}
|
||||
}
|
||||
|
||||
public class ZoneEntrance
|
||||
{
|
||||
public uint zoneId;
|
||||
|
Reference in New Issue
Block a user