private void HandleInvite(GameSession session, PacketReader packet) { string target = packet.ReadUnicodeString(); Player other = GameServer.Storage.GetPlayerByName(target); if (other == null) { return; } if (other.PartyId != 0) { session.Send(ChatPacket.Send(session.Player, other.Session.Player.Name + " is already in a party.", ChatType.NoticeAlert2)); return; } Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId); if (party == null) { session.Send(PartyPacket.Create(session.Player)); } else if (party.Members.Count >= party.MaxMembers) { session.Send(ChatPacket.Send(session.Player, "Your party is full!", ChatType.NoticeAlert2)); return; } other.Session.Send(PartyPacket.SendInvite(session.Player)); }
private static void SetEnchantStats(GameSession session, ItemEnchant itemEnchantStats, Item item) { Dictionary <StatAttribute, ItemStat> statDiff = GetEnchantStatDiff(item.Stats.Enchants, itemEnchantStats.Stats); foreach (ItemStat stat in itemEnchantStats.Stats.Values) { if (!item.Stats.Enchants.ContainsKey(stat.ItemAttribute)) { item.Stats.Enchants[stat.ItemAttribute] = new BasicStat(stat.ItemAttribute, stat.Rate, StatAttributeType.Rate); continue; } item.Stats.Enchants[stat.ItemAttribute].Flat = stat.Flat; item.Stats.Enchants[stat.ItemAttribute].Rate = stat.Rate; } item.EnchantLevel++; item.EnchantExp = 0; item.Charges -= itemEnchantStats.Rates.ChargesAdded; if (item.EnchantLevel > 11) { string message = $"3,{item.Uid},{ChatLinkType.Enchant},{session.Player.Name}"; //unk what 3 is MapleServer.BroadcastPacketAll(ItemLinkPacket.SendLinkItem(new() { item })); MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, ChatType.ItemEnchant)); } session.Send(ItemEnchantPacket.EnchantSuccess(item, statDiff.Values.ToList())); //TODO: If item is equipped, update stats }
public void SendChat(Player player, string message, ChatType type) { Broadcast(session => { session.Send(ChatPacket.Send(player, message, type)); }); }
private static void HandleGuildNoticeChat(GameSession session, string message, ChatType type) { Guild guild = GameServer.GuildManager.GetGuildById(session.Player.GuildId); if (guild == null || session.Player != guild.Leader) // TODO: change this to allow jr leaders to be able to use guild notices { return; } guild.BroadcastPacketGuild(ChatPacket.Send(session.Player, message, type)); }
private static void HandlePartyChat(GameSession session, string message, ChatType type) { Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId); if (party == null) { return; } party.BroadcastPacketParty(ChatPacket.Send(session.Player, message, type)); }
private static void HandleGuildChat(GameSession session, string message, ChatType type) { Guild guild = GameServer.GuildManager.GetGuildById(session.Player.GuildId); if (guild == null) { return; } guild.BroadcastPacketGuild(ChatPacket.Send(session.Player, message, type)); }
public override void Handle(GameSession session, PacketReader packet) { ChatType type = (ChatType)packet.ReadInt(); string message = packet.ReadUnicodeString(); string recipient = packet.ReadUnicodeString(); packet.ReadLong(); GameCommandActions.Process(session, message); switch (type) { case ChatType.Channel: //TODO: Send to all players on current channel break; case ChatType.Super: case ChatType.World: //Send to all players online MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, type)); break; case ChatType.GuildNotice: case ChatType.Guild: //TODO: Send to all in guild break; case ChatType.Party: Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId); if (party != null) { party.BroadcastPacketParty(ChatPacket.Send(session.Player, message, type)); } break; case ChatType.WhisperTo: Player recipientPlayer = GameServer.Storage.GetPlayerByName(recipient); if (recipientPlayer != null) { recipientPlayer.Session.Send(ChatPacket.Send(session.Player, message, ChatType.WhisperFrom)); session.Send(ChatPacket.Send(recipientPlayer, message, ChatType.WhisperTo)); } else { session.Send(ChatPacket.Send(session.Player, "Player not found or they are not online.", ChatType.WhisperFail)); } break; default: session.FieldManager.SendChat(session.Player, message, type); break; } }
private static void HandleWorldChat(GameSession session, string message, ChatType type) { Item voucher = session.Player.Inventory.Items.Values.FirstOrDefault(x => x.Tag == "FreeWorldChatCoupon"); if (voucher != null) { session.Send(NoticePacket.Notice(SystemNotice.UsedWorldChatVoucher, NoticeType.ChatAndFastText)); InventoryController.Consume(session, voucher.Uid, 1); } else if (!session.Player.Wallet.RemoveMerets(30)) { session.Send(ChatPacket.Error(session.Player, SystemNotice.InsufficientMerets, ChatType.NoticeAlert)); return; } MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, type)); }
private static void HandleWhisperChat(GameSession session, string recipient, string message) { Player recipientPlayer = GameServer.Storage.GetPlayerByName(recipient); if (recipientPlayer == null) { session.Send(ChatPacket.Error(session.Player, SystemNotice.UnableToWhisper, ChatType.WhisperFail)); return; } if (BuddyManager.IsBlocked(session.Player, recipientPlayer)) { session.Send(ChatPacket.Error(session.Player, SystemNotice.UnableToWhisper, ChatType.WhisperFail)); return; } recipientPlayer.Session.Send(ChatPacket.Send(session.Player, message, ChatType.WhisperFrom)); session.Send(ChatPacket.Send(recipientPlayer, message, ChatType.WhisperTo)); }
private void HandleVoteKick(GameSession session, PacketReader packet) { long charId = packet.ReadLong(); Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId); if (party == null) { return; } Player kickedPlayer = GameServer.Storage.GetPlayerById(charId); if (kickedPlayer == null) { return; } party.BroadcastPacketParty(ChatPacket.Send(session.Player, session.Player.Name + " voted to kick " + kickedPlayer.Name, ChatType.NoticeAlert3)); //TODO: Keep a counter of vote kicks for a player? }
private static void HandleJoin(GameSession session, PacketReader packet) { Party party = GameServer.PartyManager.GetPartyById(session.Player.PartyId); if (party == null) { return; } long clubId = packet.ReadLong(); Club club = GameServer.ClubManager.GetClubById(clubId); if (club == null) { return; } if (club.Leader.CharacterId == session.Player.CharacterId) { party.BroadcastPacketParty(ClubPacket.UpdatePlayerClubList(session.Player, club)); } else { int response = packet.ReadInt(); // 0 = accept, 76 (0x4C) = reject if (response == 0) { party.BroadcastPacketParty(ClubPacket.ConfirmCreate(club.Id)); club.Leader.Session.Send(ClubPacket.Join(session.Player, club)); club.Leader.Session.Send(ClubPacket.Establish(club)); // TODO add member to club (club.AddMember(session.Player);) } else { // TODO update to proper rejection packet party.Leader.Session.Send(ChatPacket.Send(party.Leader, session.Player.Name + " declined the invitation.", ChatType.NoticeAlert2)); } } }
private static void HandleSuperChat(GameSession session, string message, ChatType type) { if (session.Player.SuperChat == 0) { return; } Item superChatItem = session.Player.Inventory.Items.Values.FirstOrDefault(x => x.Function.Id == session.Player.SuperChat); if (superChatItem == null) { session.Player.SuperChat = 0; session.Send(SuperChatPacket.Deselect(session.FieldPlayer)); session.Send(ChatPacket.Error(session.Player, SystemNotice.InsufficientSuperChatThemes, ChatType.NoticeAlert)); return; } MapleServer.BroadcastPacketAll(ChatPacket.Send(session.Player, message, type)); InventoryController.Consume(session, superChatItem.Uid, 1); session.Send(SuperChatPacket.Deselect(session.FieldPlayer)); session.Player.SuperChat = 0; }
private static void HandleGuildAlert(GameSession session, string message, ChatType type) { Guild guild = GameServer.GuildManager.GetGuildById(session.Player.Guild.Id); if (guild == null) { return; } GuildMember member = guild.Members.FirstOrDefault(x => x.Player == session.Player); if (member == null) { return; } if (!((GuildRights)guild.Ranks[member.Rank].Rights).HasFlag(GuildRights.CanGuildAlert)) { return; } guild.BroadcastPacketGuild(ChatPacket.Send(session.Player, message, type)); }
private void HandleInvite(GameSession session, PacketReader packet) { string target = packet.ReadUnicodeString(); Player other = GameServer.Storage.GetPlayerByName(target); if (other == null) { return; } if (other.PartyId == 0) { other.Session.Send(PartyPacket.SendInvite(session.Player)); if (session.Player.PartyId == 0) { session.Send(PartyPacket.Create(session.Player)); } //pSession.Send(ChatPacket.Send(session.Player, "You were invited to a party by " + session.Player.Name, ChatType.NoticeAlert)); } else { session.Send(ChatPacket.Send(session.Player, other.Session.Player.Name + " is already in a party.", ChatType.NoticeAlert2)); } }
private void JoinParty(GameSession session, string leaderName, bool accept, int unknown) { Player partyLeader = GameServer.Storage.GetPlayerByName(leaderName); if (partyLeader == null) { return; } GameSession leaderSession = partyLeader.Session; if (!accept) { //Send Decline message to inviting player leaderSession.Send(ChatPacket.Send(partyLeader, session.Player.Name + " declined the invitation.", ChatType.NoticeAlert2)); return; } Party party = GameServer.PartyManager.GetPartyByLeader(partyLeader); if (party != null) { //Existing party, add joining player to all other party members. party.BroadcastPacketParty(PartyPacket.Join(session.Player)); party.BroadcastPacketParty(PartyPacket.UpdatePlayer(session.Player)); party.BroadcastPacketParty(PartyPacket.UpdateHitpoints(session.Player)); party.AddMember(session.Player); if (party.PartyFinderId != 0) { if (party.Members.Count >= party.MaxMembers) { party.PartyFinderId = 0; //Hide from party finder if full party.BroadcastPacketParty(MatchPartyPacket.RemoveListing(party)); party.BroadcastPacketParty( MatchPartyPacket.SendListings(GameServer.PartyManager.GetPartyFinderList())); party.BroadcastPacketParty(PartyPacket.MatchParty(null)); } else { session.Send( MatchPartyPacket.CreateListing(party)); //Add recruitment listing for newly joining player session.Send(PartyPacket.MatchParty(party)); } } } else { //Create new party Party newParty = new(10, new List <Player> { partyLeader, session.Player }); GameServer.PartyManager.AddParty(newParty); //Send the party leader all the stuff for the joining player leaderSession.Send(PartyPacket.Join(session.Player)); leaderSession.Send(PartyPacket.UpdatePlayer(session.Player)); leaderSession.Send(PartyPacket.UpdateHitpoints(session.Player)); leaderSession.Send(PartyPacket.UpdateHitpoints(partyLeader)); party = newParty; } //Create existing party based on the list of party members session.Send(PartyPacket.CreateExisting(partyLeader, party.Members)); session.Send(PartyPacket.UpdatePlayer(session.Player)); foreach (Player partyMember in party.Members) { //Skip first character because of the scuffed Create packet. For now this is a workaround and functions the same. if (partyMember.CharacterId != party.Members.First().CharacterId) { //Adds the party member to the UI session.Send(PartyPacket.Join(partyMember)); } //Update the HP for each party member. session.Send(PartyPacket.UpdateHitpoints(partyMember)); } }
private void HandleJoin(GameSession session, PacketReader packet) { string target = packet.ReadUnicodeString(); //Who invited the player int accept = packet.ReadByte(); //If the player accepted int unknown = packet.ReadInt(); //Something something I think it's dungeon not sure Player partyLeader = GameServer.Storage.GetPlayerByName(target); if (partyLeader == null) { return; } GameSession leaderSession = partyLeader.Session; if (accept == 1) { Party party = GameServer.PartyManager.GetPartyByLeader(partyLeader); if (party != null) { //Existing party, add joining player to all other party members. party.BroadcastPacketParty(PartyPacket.Join(session.Player)); party.BroadcastPacketParty(PartyPacket.UpdatePlayer(session.Player)); party.BroadcastPacketParty(PartyPacket.UpdateHitpoints(session.Player)); party.AddMember(session.Player); } else { //Create new party Party newParty = new Party(GuidGenerator.Int(), 10, new List <Player> { partyLeader, session.Player }); GameServer.PartyManager.AddParty(newParty); //Send the party leader all the stuff for the joining player leaderSession.Send(PartyPacket.Join(session.Player)); leaderSession.Send(PartyPacket.UpdatePlayer(session.Player)); leaderSession.Send(PartyPacket.UpdateHitpoints(session.Player)); leaderSession.Send(PartyPacket.UpdateHitpoints(partyLeader)); partyLeader.PartyId = newParty.Id; party = newParty; } session.Player.PartyId = party.Id; //Create existing party based on the list of party members session.Send(PartyPacket.CreateExisting(partyLeader, party.Members)); session.Send(PartyPacket.UpdatePlayer(session.Player)); foreach (Player partyMember in party.Members) { //Skip first character because of the scuffed Create packet. For now this is a workaround and functions the same. if (partyMember.CharacterId != party.Members.First().CharacterId) { //Adds the party member to the UI session.Send(PartyPacket.Join(partyMember)); } //Update the HP for each party member. session.Send(PartyPacket.UpdateHitpoints(partyMember)); } //Sometimes the party leader doesn't get set correctly. Not sure how to fix. } else { //Send Decline message to inviting player leaderSession.Send(ChatPacket.Send(partyLeader, session.Player.Name + " declined the invitation.", ChatType.NoticeAlert2)); } }
public void SendNotice(string message) { Send(ChatPacket.Send(Player, message, ChatType.NoticeAlert)); }