1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-21 20:27:47 +00:00

Setting the active linkshell now works.

This commit is contained in:
Filip Maj 2017-01-09 23:12:56 -05:00
parent fe1a652cd1
commit 9bc3fc8dd7
11 changed files with 196 additions and 14 deletions

View file

@ -289,6 +289,7 @@
<Compile Include="packets\WorldPackets\Send\Group\CreateLinkshellPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\CreateLinkshellPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\DeleteLinkshellPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\DeleteLinkshellPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellInviteCancelPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\LinkshellInviteCancelPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellChangePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\LinkshellRankChangePacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\LinkshellRankChangePacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\ModifyLinkshellPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\ModifyLinkshellPacket.cs" />
<Compile Include="packets\WorldPackets\Send\Group\GroupInviteResultPacket.cs" /> <Compile Include="packets\WorldPackets\Send\Group\GroupInviteResultPacket.cs" />

View file

@ -708,6 +708,12 @@ namespace FFXIVClassic_Map_Server
Server.GetWorldConnection().QueuePacket(packet, true, false); Server.GetWorldConnection().QueuePacket(packet, true, false);
} }
public void RequestWorldLinkshellChangeActive(Player player, string lsname)
{
SubPacket packet = LinkshellChangePacket.BuildPacket(player.playerSession, lsname);
Server.GetWorldConnection().QueuePacket(packet, true, false);
}
private void RequestWorldServerZoneChange(Player player, uint destinationZoneId, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) private void RequestWorldServerZoneChange(Player player, uint destinationZoneId, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation)
{ {
ZoneConnection zc = Server.GetWorldConnection(); ZoneConnection zc = Server.GetWorldConnection();

View file

@ -0,0 +1,30 @@
using FFXIVClassic.Common;
using FFXIVClassic_Map_Server.Actors;
using FFXIVClassic_Map_Server.dataobjects;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group
{
class LinkshellChangePacket
{
public const ushort OPCODE = 0x1028;
public const uint PACKET_SIZE = 0x48;
public static SubPacket BuildPacket(Session session, string lsName)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
binWriter.Write(Encoding.ASCII.GetBytes(lsName), 0, Encoding.ASCII.GetByteCount(lsName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(lsName));
}
}
return new SubPacket(true, OPCODE, session.id, session.id, data);
}
}
}

View file

@ -1,4 +1,7 @@
using FFXIVClassic_World_Server.Packets.Send.Subpackets; using FFXIVClassic.Common;
using FFXIVClassic_World_Server.DataObjects.Group;
using FFXIVClassic_World_Server.Packets.Send.Subpackets;
using FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
@ -16,7 +19,7 @@ namespace FFXIVClassic_World_Server.DataObjects
public string characterName; public string characterName;
public uint currentZoneId; public uint currentZoneId;
public uint activeLinkshellIndex = 0; public string activeLinkshellName = "";
public readonly ClientConnection clientConnection; public readonly ClientConnection clientConnection;
public readonly Channel type; public readonly Channel type;
@ -65,5 +68,15 @@ namespace FFXIVClassic_World_Server.DataObjects
clientConnection.QueuePacket(GameMessagePacket.BuildPacket(0x5FF80001, sessionId, 0x5FF80001, textId, displayId, log, LuaUtils.CreateLuaParamList(msgParams)), true, false); clientConnection.QueuePacket(GameMessagePacket.BuildPacket(0x5FF80001, sessionId, 0x5FF80001, textId, displayId, log, LuaUtils.CreateLuaParamList(msgParams)), true, false);
} }
public bool SetActiveLS(string name)
{
if (Database.SetActiveLS(this, name))
{
activeLinkshellName = name;
return true;
}
return false;
}
} }
} }

View file

@ -45,7 +45,7 @@ namespace FFXIVClassic_World_Server
public static bool LoadZoneSessionInfo(Session session) public static bool LoadZoneSessionInfo(Session session)
{ {
string characterName; string characterName, currentLinkshell;
uint currentZone = 0; uint currentZone = 0;
uint destinationZone = 0; uint destinationZone = 0;
bool readIn = false; bool readIn = false;
@ -55,7 +55,7 @@ namespace FFXIVClassic_World_Server
try try
{ {
conn.Open(); conn.Open();
MySqlCommand cmd = new MySqlCommand("SELECT name, currentZoneId, destinationZoneId FROM characters WHERE id = @charaId", conn); MySqlCommand cmd = new MySqlCommand("SELECT name, currentZoneId, destinationZoneId, currentActiveLinkshell FROM characters WHERE id = @charaId", conn);
cmd.Parameters.AddWithValue("@charaId", session.sessionId); cmd.Parameters.AddWithValue("@charaId", session.sessionId);
using (MySqlDataReader Reader = cmd.ExecuteReader()) using (MySqlDataReader Reader = cmd.ExecuteReader())
{ {
@ -64,9 +64,11 @@ namespace FFXIVClassic_World_Server
characterName = Reader.GetString("name"); characterName = Reader.GetString("name");
currentZone = Reader.GetUInt32("currentZoneId"); currentZone = Reader.GetUInt32("currentZoneId");
destinationZone = Reader.GetUInt32("destinationZoneId"); destinationZone = Reader.GetUInt32("destinationZoneId");
currentLinkshell = Reader.GetString("currentActiveLinkshell");
session.characterName = characterName; session.characterName = characterName;
session.currentZoneId = currentZone; session.currentZoneId = currentZone;
session.activeLinkshellName = currentLinkshell;
readIn = true; readIn = true;
} }
@ -501,5 +503,31 @@ namespace FFXIVClassic_World_Server
} }
return success; return success;
} }
public static bool SetActiveLS(Session session, string name)
{
bool success = 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("UPDATE characters SET currentActiveLinkshell = @lsName WHERE id = @charaId", conn);
cmd.Parameters.AddWithValue("@charaId", session.sessionId);
cmd.Parameters.AddWithValue("@lsName", name);
cmd.ExecuteNonQuery();
success = true;
}
catch (MySqlException e)
{
Program.Log.Error(e.ToString());
}
finally
{
conn.Dispose();
}
}
return success;
}
} }
} }

View file

@ -112,6 +112,7 @@
<Compile Include="Packets\Send\Subpackets\Groups\CreateNamedGroup.cs" /> <Compile Include="Packets\Send\Subpackets\Groups\CreateNamedGroup.cs" />
<Compile Include="Packets\Send\Subpackets\Groups\CreateNamedGroupMultiple.cs" /> <Compile Include="Packets\Send\Subpackets\Groups\CreateNamedGroupMultiple.cs" />
<Compile Include="Packets\Send\Subpackets\Groups\DeleteGroupPacket.cs" /> <Compile Include="Packets\Send\Subpackets\Groups\DeleteGroupPacket.cs" />
<Compile Include="Packets\Send\Subpackets\Groups\SetActiveLinkshellPacket.cs" />
<Compile Include="Packets\Send\Subpackets\Groups\GroupHeaderPacket.cs" /> <Compile Include="Packets\Send\Subpackets\Groups\GroupHeaderPacket.cs" />
<Compile Include="Packets\Send\Subpackets\Groups\GroupMember.cs" /> <Compile Include="Packets\Send\Subpackets\Groups\GroupMember.cs" />
<Compile Include="Packets\Send\Subpackets\Groups\GroupMembersBeginPacket.cs" /> <Compile Include="Packets\Send\Subpackets\Groups\GroupMembersBeginPacket.cs" />
@ -128,12 +129,12 @@
<Compile Include="Packets\WorldPackets\Receive\Group\GroupInviteResultPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\GroupInviteResultPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInviteCancelPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInviteCancelPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInvitePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\LinkshellInvitePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellChangePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellRankChangePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\LinkshellRankChangePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\LinkshellLeavePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\LinkshellLeavePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\PartyLeavePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\PartyLeavePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\PartyInvitePacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\PartyInvitePacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\PartyModifyPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\PartyModifyPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\SetActiveLinkshellPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\ModifyLinkshellPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\ModifyLinkshellPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\CreateRelationPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\CreateRelationPacket.cs" />
<Compile Include="Packets\WorldPackets\Receive\Group\CreateLinkshellPacket.cs" /> <Compile Include="Packets\WorldPackets\Receive\Group\CreateLinkshellPacket.cs" />

View file

@ -0,0 +1,42 @@
using FFXIVClassic.Common;
using FFXIVClassic_World_Server.DataObjects.Group;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace FFXIVClassic_World_Server.Packets.Send.Subpackets.Groups
{
class SetActiveLinkshellPacket
{
public const ushort OPCODE = 0x018A;
public const uint PACKET_SIZE = 0x98;
public static SubPacket BuildPacket(uint sessionId, ulong groupId)
{
byte[] data = new byte[PACKET_SIZE - 0x20];
using (MemoryStream mem = new MemoryStream(data))
{
using (BinaryWriter binWriter = new BinaryWriter(mem))
{
//Write the LS groupId
binWriter.Write((UInt64)groupId);
//Write the LS group type
binWriter.Seek(0x40, SeekOrigin.Begin);
binWriter.Write((UInt32)Group.CompanyGroup);
//Seems to be a index but can only set one active so /shrug
binWriter.Seek(0x60, SeekOrigin.Begin);
binWriter.Write((UInt32)(groupId == 0 ? 0 : 1));
}
}
return new SubPacket(OPCODE, sessionId, sessionId, data);
}
}
}

View file

@ -5,13 +5,13 @@ using System.Text;
namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{ {
class SetActiveLinkshellPacket class LinkshellChangePacket
{ {
public bool invalidPacket = false; public bool invalidPacket = false;
public string name; public string lsName;
public SetActiveLinkshellPacket(byte[] data) public LinkshellChangePacket(byte[] data)
{ {
using (MemoryStream mem = new MemoryStream(data)) using (MemoryStream mem = new MemoryStream(data))
{ {
@ -19,7 +19,7 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{ {
try try
{ {
name = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' }); lsName = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
} }
catch (Exception) catch (Exception)
{ {

View file

@ -302,8 +302,8 @@ namespace FFXIVClassic_World_Server
break; break;
//Linkshell set active //Linkshell set active
case 0x1028: case 0x1028:
SetActiveLinkshellPacket setActiveLinkshellPacket = new SetActiveLinkshellPacket(subpacket.data); LinkshellChangePacket linkshellChangePacket = new LinkshellChangePacket(subpacket.data);
//Linkshell ls = mWorldManager.GetLinkshellManager().GetLinkshell(); mWorldManager.ProcessLinkshellSetActive(GetSession(subpacket.header.sourceId), linkshellChangePacket.lsName);
break; break;
//Linkshell invite member //Linkshell invite member
case 0x1029: case 0x1029:

View file

@ -220,6 +220,24 @@ namespace FFXIVClassic_World_Server
List<Linkshell> linkshells = mLinkshellManager.GetPlayerLinkshellMembership(session.sessionId); List<Linkshell> linkshells = mLinkshellManager.GetPlayerLinkshellMembership(session.sessionId);
foreach (Linkshell ls in linkshells) foreach (Linkshell ls in linkshells)
ls.SendGroupPackets(session); ls.SendGroupPackets(session);
//Reset to blank if in unknown state
ulong activeGroupIndex = 0;
if (!session.activeLinkshellName.Equals(""))
{
Linkshell activeLs = mLinkshellManager.GetLinkshell(session.activeLinkshellName);
if (activeLs != null && activeLs.HasMember(session.sessionId))
{
activeGroupIndex = activeLs.groupIndex;
}
else
{
session.activeLinkshellName = "";
Database.SetActiveLS(session, "");
}
}
SubPacket activeLsPacket = SetActiveLinkshellPacket.BuildPacket(session.sessionId, activeGroupIndex);
session.clientConnection.QueuePacket(activeLsPacket, true, false);
} }
private void SendMotD(Session session) private void SendMotD(Session session)
@ -408,6 +426,34 @@ namespace FFXIVClassic_World_Server
relation.SendDeletePackets(inviterSession.sessionId, inviteeSession.sessionId); relation.SendDeletePackets(inviterSession.sessionId, inviteeSession.sessionId);
} }
public void ProcessLinkshellSetActive(Session requestSession, string lsName)
{
//Deactivate all
if (lsName.Equals(""))
{
requestSession.SetActiveLS(lsName);
SubPacket activeLsPacket = SetActiveLinkshellPacket.BuildPacket(requestSession.sessionId, 0);
requestSession.clientConnection.QueuePacket(activeLsPacket, true, false);
requestSession.SendGameMessage(25132, 0x20, (object)1);
}
else
{
Linkshell ls = mLinkshellManager.GetLinkshell(lsName);
if (ls == null || !ls.HasMember(requestSession.sessionId))
{
requestSession.SendGameMessage(25167, 0x20, (object)1, (object)lsName);
}
else
{
requestSession.SetActiveLS(lsName);
SubPacket activeLsPacket = SetActiveLinkshellPacket.BuildPacket(requestSession.sessionId, ls.groupIndex);
requestSession.clientConnection.QueuePacket(activeLsPacket, true, false);
requestSession.SendGameMessage(25131, 0x20, (object)1, (object)lsName);
}
}
}
public void IncrementGroupIndex() public void IncrementGroupIndex()
{ {
mRunningGroupIndex++; mRunningGroupIndex++;

View file

@ -0,0 +1,15 @@
--[[
LinkshellChangeCommand Script
--]]
function onEventStarted(player, actor, triggerName, linkshellName, arg1, arg2)
if (linkshellName == nil) then
linkshellName = "";
end
GetWorldManager():RequestWorldLinkshellChangeActive(player, linkshellName);
player:EndEvent();
end