LS kicking and leaving work.

This commit is contained in:
Filip Maj 2017-01-09 00:12:11 -05:00
parent 61e4effd74
commit 771b5b6d81
7 changed files with 139 additions and 16 deletions

View File

@ -698,7 +698,13 @@ namespace FFXIVClassic_Map_Server
public void RequestWorldLinkshellLeave(Player player, string lsname) public void RequestWorldLinkshellLeave(Player player, string lsname)
{ {
SubPacket packet = LinkshellLeavePacket.BuildPacket(player.playerSession, lsname, false); SubPacket packet = LinkshellLeavePacket.BuildPacket(player.playerSession, lsname, null, false);
Server.GetWorldConnection().QueuePacket(packet, true, false);
}
public void RequestWorldLinkshellKick(Player player, string lsname, string kickedName)
{
SubPacket packet = LinkshellLeavePacket.BuildPacket(player.playerSession, lsname, kickedName, true);
Server.GetWorldConnection().QueuePacket(packet, true, false); Server.GetWorldConnection().QueuePacket(packet, true, false);
} }

View File

@ -11,16 +11,19 @@ namespace FFXIVClassic_Map_Server.packets.WorldPackets.Send.Group
class LinkshellLeavePacket class LinkshellLeavePacket
{ {
public const ushort OPCODE = 0x1031; public const ushort OPCODE = 0x1031;
public const uint PACKET_SIZE = 0x48; public const uint PACKET_SIZE = 0x68;
public static SubPacket BuildPacket(Session session, string lsName, bool isDisband) public static SubPacket BuildPacket(Session session, string lsName, string kickedName, bool isKicked)
{ {
byte[] data = new byte[PACKET_SIZE - 0x20]; byte[] data = new byte[PACKET_SIZE - 0x20];
using (MemoryStream mem = new MemoryStream(data)) using (MemoryStream mem = new MemoryStream(data))
{ {
using (BinaryWriter binWriter = new BinaryWriter(mem)) using (BinaryWriter binWriter = new BinaryWriter(mem))
{ {
binWriter.Write((UInt16)(isDisband ? 1 : 0)); binWriter.Write((UInt16)(isKicked ? 1 : 0));
if (kickedName != null && isKicked)
binWriter.Write(Encoding.ASCII.GetBytes(kickedName), 0, Encoding.ASCII.GetByteCount(kickedName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(kickedName));
binWriter.Seek(0x22, SeekOrigin.Begin);
binWriter.Write(Encoding.ASCII.GetBytes(lsName), 0, Encoding.ASCII.GetByteCount(lsName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(lsName)); binWriter.Write(Encoding.ASCII.GetBytes(lsName), 0, Encoding.ASCII.GetByteCount(lsName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(lsName));
} }
} }

View File

@ -122,7 +122,8 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
public void SendDeletePacket(Session session) public void SendDeletePacket(Session session)
{ {
session.clientConnection.QueuePacket(DeleteGroupPacket.buildPacket(session.sessionId, this), true, false); if (session != null)
session.clientConnection.QueuePacket(DeleteGroupPacket.buildPacket(session.sessionId, this), true, false);
} }
public virtual void SendInitWorkValues(Session session) public virtual void SendInitWorkValues(Session session)

View File

@ -176,6 +176,19 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
} }
} }
public LinkshellMember GetMember(string name)
{
lock (members)
{
for (int i = 0; i < members.Count; i++)
{
if (Server.GetServer().GetNameForId((members[i].charaId)).Equals(name))
return members[i];
}
return null;
}
}
public bool HasMember(uint id) public bool HasMember(uint id)
{ {
lock (members) lock (members)
@ -205,12 +218,54 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
} }
//Send you are leaving message //Send you are leaving message
requestSession.SendGameMessage(25162, 0x20, (Object)1, (Object)Server.GetServer().GetNameForId(leaver)); requestSession.SendGameMessage(25162, 0x20, (Object)1, name);
//All good, remove //All good, remove
Server.GetServer().GetWorldManager().GetLinkshellManager().RemoveMemberFromLinkshell(requestSession.sessionId, name); Server.GetServer().GetWorldManager().GetLinkshellManager().RemoveMemberFromLinkshell(requestSession.sessionId, name);
SendGroupPacketsAll(GetMemberIds()); SendGroupPacketsAll(GetMemberIds());
ResendWorkValues(); ResendWorkValues();
//Delete group for kicked guy
SendDeletePacket(requestSession);
}
public void KickRequest(Session requestSession, string kickedName)
{
LinkshellMember kicked = GetMember(kickedName);
Session kickedSession = Server.GetServer().GetSession(kicked.charaId);
//Check if ls contains this person
if (!HasMember(kicked.charaId))
{
requestSession.SendGameMessage(25281, 0x20, (Object)1, (Object)kickedName, (Object)name);
return;
}
//Send you are exiled message
lock (members)
{
for (int i = 0; i < members.Count; i++)
{
Session session = Server.GetServer().GetSession(members[i].charaId);
if (session == null)
continue;
if (session.sessionId == kicked.charaId)
session.SendGameMessage(25184, 0x20, (Object)1, (Object)name);
else
session.SendGameMessage(25280, 0x20, (Object)1, (Object)kickedName, (Object)name);
}
}
//All good, remove
Server.GetServer().GetWorldManager().GetLinkshellManager().RemoveMemberFromLinkshell(kicked.charaId, name);
SendGroupPacketsAll(GetMemberIds());
ResendWorkValues();
//Delete group for kicked guy
SendDeletePacket(kickedSession);
} }
public void RankChangeRequest(Session requestSession, string name, byte rank) public void RankChangeRequest(Session requestSession, string name, byte rank)
@ -221,9 +276,12 @@ namespace FFXIVClassic_World_Server.DataObjects.Group
{ {
if (Server.GetServer().GetNameForId(members[i].charaId).Equals(name)) if (Server.GetServer().GetNameForId(members[i].charaId).Equals(name))
{ {
members[i].rank = rank; if (Database.LinkshellChangeRank(members[i].charaId, rank))
ResendWorkValues(); {
requestSession.SendGameMessage(25277, 0x20, (object)(100000 + rank), (object)name); members[i].rank = rank;
ResendWorkValues();
requestSession.SendGameMessage(25277, 0x20, (object)(100000 + rank), (object)name);
}
return; return;
} }
} }

View File

@ -420,7 +420,34 @@ namespace FFXIVClassic_World_Server
public static bool LinkshellRemovePlayer(ulong lsId, uint charaId) public static bool LinkshellRemovePlayer(ulong lsId, uint charaId)
{ {
throw new NotImplementedException(); 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();
string query = @"
DELETE FROM characters_linkshells
WHERE characterId = @charaId AND linkshellId = @lsId;
";
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@charaId", charaId);
cmd.Parameters.AddWithValue("@lsId", lsId);
cmd.ExecuteNonQuery();
success = true;
}
catch (MySqlException e)
{
Program.Log.Error(e.ToString());
}
finally
{
conn.Dispose();
}
}
return success;
} }
public static bool ChangeLinkshellCrest(ulong lsId, ushort newCrestId) public static bool ChangeLinkshellCrest(ulong lsId, ushort newCrestId)
@ -448,5 +475,31 @@ namespace FFXIVClassic_World_Server
} }
return success; return success;
} }
public static bool LinkshellChangeRank(uint charaId, byte rank)
{
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_linkshells SET rank = @rank WHERE characterId = @charaId", conn);
cmd.Parameters.AddWithValue("@charaId", charaId);
cmd.Parameters.AddWithValue("@rank", rank);
cmd.ExecuteNonQuery();
success = true;
}
catch (MySqlException e)
{
Program.Log.Error(e.ToString());
}
finally
{
conn.Dispose();
}
}
return success;
}
} }
} }

View File

@ -9,8 +9,9 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{ {
public bool invalidPacket = false; public bool invalidPacket = false;
public bool isDisband; public bool isKicked;
public string lsName; public string lsName;
public string kickedName;
public LinkshellLeavePacket(byte[] data) public LinkshellLeavePacket(byte[] data)
{ {
@ -20,7 +21,8 @@ namespace FFXIVClassic_World_Server.Packets.WorldPackets.Receive.Group
{ {
try try
{ {
isDisband = binReader.ReadUInt16() == 1; isKicked = binReader.ReadUInt16() == 1;
kickedName = Encoding.ASCII.GetString(binReader.ReadBytes(0x20)).Trim(new[] { '\0' });
lsName = 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

@ -315,12 +315,12 @@ namespace FFXIVClassic_World_Server
LinkshellInviteCancelPacket linkshellInviteCancelPacket = new LinkshellInviteCancelPacket(subpacket.data); LinkshellInviteCancelPacket linkshellInviteCancelPacket = new LinkshellInviteCancelPacket(subpacket.data);
mWorldManager.ProcessLinkshellInviteCancel(GetSession(subpacket.header.sourceId)); mWorldManager.ProcessLinkshellInviteCancel(GetSession(subpacket.header.sourceId));
break; break;
//Linkshell resign/disband //Linkshell resign/kicked
case 0x1031: case 0x1031:
LinkshellLeavePacket linkshellLeavePacket = new LinkshellLeavePacket(subpacket.data); LinkshellLeavePacket linkshellLeavePacket = new LinkshellLeavePacket(subpacket.data);
Linkshell lsLeave = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellLeavePacket.lsName); Linkshell lsLeave = mWorldManager.GetLinkshellManager().GetLinkshell(linkshellLeavePacket.lsName);
if (linkshellLeavePacket.isDisband) if (linkshellLeavePacket.isKicked)
lsLeave.DisbandRequest(GetSession(subpacket.header.sourceId)); lsLeave.KickRequest(GetSession(subpacket.header.sourceId), linkshellLeavePacket.kickedName);
else else
lsLeave.LeaveRequest(GetSession(subpacket.header.sourceId)); lsLeave.LeaveRequest(GetSession(subpacket.header.sourceId));
break; break;