private void HandleShopPacket(ISClientMessages opcode, Packet packet) { switch (opcode) { case ISClientMessages.PlayerQuitCashShop: // CC back to channel from cashserver { string hash = packet.ReadString(); int charid = packet.ReadInt(); byte world = packet.ReadByte(); Character chr = CenterServer.Instance.FindCharacter(charid); if (chr == null) { return; } Packet pw = new Packet(ISServerMessages.PlayerChangeServerResult); pw.WriteString(hash); pw.WriteInt(charid); if (World.ID == world && World.GameServers.TryGetValue(chr.LastChannel, out LocalServer ls)) { pw.WriteBytes(ls.PublicIP.GetAddressBytes()); pw.WriteUShort(ls.Port); RedisBackend.Instance.SetMigratingPlayer(charid); chr.InCashShop = false; chr.isCCing = true; chr.LastChannel = 0; // Give the channel server some info from this server var channelPacket = new Packet(ISServerMessages.PlayerChangeServerData); channelPacket.WriteInt(charid); channelPacket.WriteBytes(packet.ReadLeftoverBytes()); if (Server.InMaintenance) { // Server in maintenance... ls.TransferConnection?.SendPacket(channelPacket); } else { // Changing channels, meh ls.Connection?.SendPacket(channelPacket); } } else { pw.WriteInt(0); pw.WriteShort(0); } SendPacket(pw); break; } } }
private void HandleGamePacket(ISClientMessages opcode, Packet packet) { switch (opcode) { #region Messenger case ISClientMessages.MessengerJoin: Messenger.JoinMessenger(packet); break; case ISClientMessages.MessengerLeave: Messenger.LeaveMessenger(packet.ReadInt()); break; case ISClientMessages.MessengerInvite: Messenger.SendInvite(packet.ReadInt(), packet.ReadString()); break; case ISClientMessages.MessengerBlocked: Messenger.Block(packet); break; case ISClientMessages.MessengerAvatar: Messenger.OnAvatar(packet); break; case ISClientMessages.MessengerChat: Messenger.Chat(packet.ReadInt(), packet.ReadString()); break; #endregion #region Party case ISClientMessages.PartyCreate: { int fuker = packet.ReadInt(); Character f****r = CenterServer.Instance.FindCharacter(fuker); Party.CreateParty(f****r); break; } case ISClientMessages.PartyInvite: { int fuker1 = packet.ReadInt(); int fuker2 = packet.ReadInt(); Character fucker1 = CenterServer.Instance.FindCharacter(fuker1); if (fucker1 != null && Party.Parties.TryGetValue(fucker1.PartyID, out Party party)) { party.Invite(fuker1, fuker2); } break; } case ISClientMessages.PartyAccept: { int AcceptorID = packet.ReadInt(); Character fucker1 = CenterServer.Instance.FindCharacter(AcceptorID); if (fucker1 != null && Party.Invites.TryGetValue(AcceptorID, out Party party)) { party.TryJoin(fucker1); } break; } case ISClientMessages.PartyLeave: { int LeaverID = packet.ReadInt(); Character f****r = CenterServer.Instance.FindCharacter(LeaverID); if (f****r != null && Party.Parties.TryGetValue(f****r.PartyID, out Party party)) { party.Leave(f****r); } break; } case ISClientMessages.PartyExpel: { int leader = packet.ReadInt(); int expelledCharacter = packet.ReadInt(); Character f****r = CenterServer.Instance.FindCharacter(leader); if (f****r != null && Party.Parties.TryGetValue(f****r.PartyID, out Party party)) { party.Expel(leader, expelledCharacter); } break; } case ISClientMessages.PartyDecline: { int decliner = packet.ReadInt(); String declinerName = packet.ReadString(); Character chr = CenterServer.Instance.FindCharacter(decliner); if (chr != null && Party.Invites.TryGetValue(decliner, out Party party)) { party.DeclineInvite(chr); } break; } case ISClientMessages.PartyChat: { int chatter = packet.ReadInt(); string msg = packet.ReadString(); Character chr = CenterServer.Instance.FindCharacter(chatter); if (chr != null && Party.Parties.TryGetValue(chr.PartyID, out Party party)) { party.Chat(chatter, msg); } break; } case ISClientMessages.PlayerUpdateMap: { int id = packet.ReadInt(); int map = packet.ReadInt(); Character f****r = CenterServer.Instance.FindCharacter(id); if (f****r != null) { f****r.MapID = map; if (Party.Parties.TryGetValue(f****r.PartyID, out Party party)) { party.SilentUpdate(id); } } break; } case ISClientMessages.PartyDoorChanged: { int chrid = packet.ReadInt(); var door = new DoorInformation(packet.ReadInt(), packet.ReadInt(), packet.ReadShort(), packet.ReadShort(), chrid); var chr = CenterServer.Instance.FindCharacter(chrid); if (chr != null && Party.Parties.TryGetValue(chr.PartyID, out var party)) { party.UpdateDoor(door, chrid); } break; } #endregion #region Buddy case ISClientMessages.BuddyInvite: { int inviterId = packet.ReadInt(); String inviterName = packet.ReadString(); String toInviteName = packet.ReadString(); Character inviter = CenterServer.Instance.FindCharacter(inviterName); Character toInvite = CenterServer.Instance.FindCharacter(toInviteName, false); if (inviter == null) { return; } if (inviter.FriendsList.IsFull()) { inviter.FriendsList.SendRequestError(12); return; } if (toInvite == null) { //How to get id from name? O.o try { var namedata = CenterServer.Instance.CharacterDatabase.RunQuery("SELECT c.`ID`, u.admin, c.buddylist_size, (SELECT COUNT(*) FROM buddylist WHERE charid = c.ID) AS `current_buddylist_size` FROM characters c JOIN users u ON u.id = c.userid WHERE c.name = @name", "@name", toInviteName) as MySqlDataReader; if (namedata.Read()) { int invitedid = namedata.GetInt32("ID"); int maxBuddyListSize = namedata.GetInt32("buddylist_size"); int buddyListSize = namedata.GetInt32("current_buddylist_size"); bool isGM = namedata.GetByte("admin") > 0; namedata.Close(); if (isGM && inviter.IsGM == false) { inviter.FriendsList.SendRequestError(14); return; } if (maxBuddyListSize <= buddyListSize) { // buddylist is full inviter.FriendsList.SendRequestError(12); return; } inviter.FriendsList.Add(new BuddyData(invitedid, toInviteName)); // No update? CenterServer.Instance.CharacterDatabase.RunQuery( "DELETE FROM buddylist_pending WHERE charid = @toinviteid AND inviter_charid = @inviterid", "@toinviteid", invitedid, "@inviterid", inviterId ); CenterServer.Instance.CharacterDatabase.RunQuery( "INSERT INTO buddylist_pending (charid, inviter_charid, inviter_charname) VALUES (@toinviteid, @inviterid, @invitername)", "@toinviteid", invitedid, "@inviterid", inviterId, "@invitername", inviterName ); } else { namedata.Close(); inviter.FriendsList.SendRequestError(15); } } catch (Exception e) { BuddyList.log.Error($"Offline buddy request failed for {inviterId} {inviterName} {toInviteName}", e); } } else { toInvite.FriendsList.Request(inviter.FriendsList.Owner); } break; } case ISClientMessages.BuddyUpdate: { int id = packet.ReadInt(); string name = packet.ReadString(); Character toUpdate = CenterServer.Instance.FindCharacter(id); toUpdate.FriendsList.OnOnlineCC(true, false); break; } case ISClientMessages.BuddyInviteAnswer: { int id = packet.ReadInt(); String name = packet.ReadString(); Character toAccept = CenterServer.Instance.FindCharacter(id); toAccept.FriendsList.AcceptRequest(); break; } case ISClientMessages.BuddyListExpand: { CenterServer.Instance.FindCharacter(packet.ReadInt()).FriendsList.IncreaseCapacity(); break; } case ISClientMessages.BuddyChat: { int fWho = packet.ReadInt(); string Who = packet.ReadString(); string what = packet.ReadString(); int recipientCount = packet.ReadByte(); int[] recipients = new int[recipientCount]; for (var i = 0; i < recipientCount; i++) { recipients[i] = packet.ReadInt(); } Character pWho = CenterServer.Instance.FindCharacter(fWho); pWho?.FriendsList.BuddyChat(what, recipients); break; } case ISClientMessages.BuddyDecline: { Character Who = CenterServer.Instance.FindCharacter(packet.ReadInt()); int victimId = packet.ReadInt(); Character Victim = CenterServer.Instance.FindCharacter(victimId); Who.FriendsList.RemoveBuddyOrRequest(Victim, victimId); break; } #endregion case ISClientMessages.PlayerUsingSuperMegaphone: { Packet pw = new Packet(ISServerMessages.PlayerSuperMegaphone); pw.WriteString(packet.ReadString()); pw.WriteBool(packet.ReadBool()); pw.WriteByte(packet.ReadByte()); World.SendPacketToEveryGameserver(pw); break; } case ISClientMessages.PlayerWhisperOrFindOperation: // WhisperOrFind { int sender = packet.ReadInt(); Character senderChar = CenterServer.Instance.FindCharacter(sender); if (senderChar == null) { return; } bool whisper = packet.ReadBool(); string receiver = packet.ReadString(); Character receiverChar = CenterServer.Instance.FindCharacter(receiver); if (whisper) { string message = packet.ReadString(); if ((receiverChar == null || !World.GameServers.ContainsKey(receiverChar.ChannelID)) || (receiverChar.IsGM && !senderChar.IsGM)) { Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult); pw.WriteBool(true); // Whisper pw.WriteBool(false); // Not found. pw.WriteInt(sender); pw.WriteString(receiver); SendPacket(pw); } else { Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult); pw.WriteBool(false); // Find pw.WriteBool(true); // Found. pw.WriteInt(sender); pw.WriteString(receiver); pw.WriteSByte(-1); pw.WriteSByte(-1); SendPacket(pw); pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult); pw.WriteBool(true); // Whisper pw.WriteBool(true); // Found. pw.WriteInt(receiverChar.ID); pw.WriteString(senderChar.Name); pw.WriteByte(senderChar.ChannelID); pw.WriteString(message); pw.WriteBool(false); // false is '>>' LocalServer victimChannel = World.GameServers[receiverChar.ChannelID]; victimChannel.Connection.SendPacket(pw); } } else { if (receiverChar == null || !World.GameServers.ContainsKey(receiverChar.ChannelID) || (receiverChar.IsGM && !senderChar.IsGM)) { Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult); pw.WriteBool(false); // Find pw.WriteBool(false); // Not found. pw.WriteInt(sender); pw.WriteString(receiver); SendPacket(pw); } else { Packet pw = new Packet(ISServerMessages.PlayerWhisperOrFindOperationResult); pw.WriteBool(false); // Find pw.WriteBool(true); // Found. pw.WriteInt(senderChar.ID); pw.WriteString(receiverChar.Name); // Cashshop if (receiverChar.InCashShop) { pw.WriteSByte(-2); } else { pw.WriteByte(receiverChar.ChannelID); } pw.WriteSByte(0); SendPacket(pw); } } break; } case ISClientMessages.UpdatePlayerJobLevel: { int charId = packet.ReadInt(); var character = CenterServer.Instance.FindCharacter(charId); if (character == null) { return; } character.Job = packet.ReadShort(); character.Level = packet.ReadByte(); break; } case ISClientMessages.AdminMessage: { Packet pw = new Packet(ISServerMessages.AdminMessage); pw.WriteString(packet.ReadString()); pw.WriteByte(packet.ReadByte()); World.SendPacketToEveryGameserver(pw); break; } case ISClientMessages.KickPlayer: { int userId = packet.ReadInt(); Program.MainForm.LogAppend("Globally kicking user " + userId); Packet pw = new Packet(ISServerMessages.KickPlayerResult); pw.WriteInt(userId); World.SendPacketToEveryGameserver(pw); break; } case ISClientMessages.ReloadEvents: CenterServer.Instance.ReloadEvents(); break; } }
private void HandleLoginPacket(ISClientMessages opcode, Packet packet) { switch (opcode) { case ISClientMessages.PlayerRequestWorldLoad: { string hash = packet.ReadString(); byte world = packet.ReadByte(); Packet pw = new Packet(ISServerMessages.PlayerRequestWorldLoadResult); pw.WriteString(hash); if (World.ID == world) { World.AddWarning(pw); } else { pw.WriteByte(2); // full load } SendPacket(pw); break; } case ISClientMessages.PlayerRequestChannelStatus: // channel online check { string hash = packet.ReadString(); byte world = packet.ReadByte(); byte channel = packet.ReadByte(); int accountId = packet.ReadInt(); Packet pw = new Packet(ISServerMessages.PlayerRequestChannelStatusResult); pw.WriteString(hash); if (World.ID != world || World.GameServers.TryGetValue(channel, out LocalServer ls) == false || ls.InMaintenance || !ls.Connected) { pw.WriteByte(0x09); // Channel Offline } else { pw.WriteByte(0); pw.WriteByte(channel); try { var ids = CharacterDBAccessor.GetCharacterIdList(accountId).ToList(); pw.WriteByte((byte)ids.Count); foreach (var id in ids) { var ad = CharacterDBAccessor.LoadAvatar(id); var ranking = CharacterDBAccessor.LoadRank(id); ad.Encode(pw); pw.WriteBool(ranking != null); if (ranking != null) { var(worldRank, worldRankMove, jobRank, jobRankMove) = ranking.Value; pw.WriteInt(worldRank); pw.WriteInt(worldRankMove); pw.WriteInt(jobRank); pw.WriteInt(jobRankMove); } } } catch (Exception ex) { Program.MainForm.LogAppend("Error while building packet for characterselect! {0}", ex); _log.Error(ex); pw = new Packet(ISServerMessages.PlayerRequestChannelStatusResult); pw.WriteString(hash); pw.WriteByte(1); } } SendPacket(pw); break; } case ISClientMessages.PlayerDeleteCharacter: { string hash = packet.ReadString(); int accountId = packet.ReadInt(); int charId = packet.ReadInt(); var p = new Packet(ISServerMessages.PlayerDeleteCharacterResult); p.WriteString(hash); p.WriteInt(charId); try { var deleteCharacterResult = CharacterDBAccessor.DeleteCharacter(accountId, charId); p.WriteByte(deleteCharacterResult); if (deleteCharacterResult == 0) { var foundChar = CenterServer.Instance.FindCharacter(charId, false); if (foundChar != null) { if (foundChar.PartyID != 0 && Party.Parties.TryGetValue(foundChar.PartyID, out Party party)) { party.Leave(foundChar); } // Registered, so get rid of it CenterServer.Instance.CharacterStore.Remove(foundChar); } } } catch (Exception ex) { _log.Error(ex); Program.MainForm.LogAppend("Error while deleting character! {0}", ex); p.WriteByte(10); } SendPacket(p); break; } case ISClientMessages.PlayerCreateCharacterNamecheck: { string hash = packet.ReadString(); string charname = packet.ReadString(); var p = new Packet(ISServerMessages.PlayerCreateCharacterNamecheckResult); p.WriteString(hash); p.WriteString(charname); try { p.WriteBool(CharacterDBAccessor.CheckDuplicateID(charname)); } catch (Exception ex) { _log.Error(ex); Program.MainForm.LogAppend("Error while checking for duplicate ID! {0}", ex); p.WriteBool(true); } SendPacket(p); break; } case ISClientMessages.PlayerCreateCharacter: { string hash = packet.ReadString(); int accountId = packet.ReadInt(); byte gender = packet.ReadByte(); string charname = packet.ReadString(); int face = packet.ReadInt(); int hair = packet.ReadInt(); int haircolor = packet.ReadInt(); int skin = packet.ReadInt(); int top = packet.ReadInt(); int bottom = packet.ReadInt(); int shoes = packet.ReadInt(); int weapon = packet.ReadInt(); byte str = packet.ReadByte(); byte dex = packet.ReadByte(); byte intt = packet.ReadByte(); byte luk = packet.ReadByte(); var p = new Packet(ISServerMessages.PlayerCreateCharacterResult); p.WriteString(hash); try { if (CharacterDBAccessor.CheckDuplicateID(charname)) { p.WriteBool(false); } else { int id = CharacterDBAccessor.CreateNewCharacter( accountId, charname, gender, face, hair, haircolor, skin, str, dex, intt, luk, top, bottom, shoes, weapon ); var ad = CharacterDBAccessor.LoadAvatar(id); p.WriteBool(true); ad.Encode(p); } } catch (Exception ex) { _log.Error(ex); Program.MainForm.LogAppend("Error while creating character! {0}", ex); p = new Packet(ISServerMessages.PlayerCreateCharacterResult); p.WriteString(hash); p.WriteBool(false); } SendPacket(p); break; } } }
public Packet(ISClientMessages pMessage) : this((byte)pMessage) { }