From e4899034b2fa38dc6a37edf750c895dd1548c02a Mon Sep 17 00:00:00 2001 From: Benjamin Elsdon Date: Wed, 27 Apr 2022 09:03:26 +0800 Subject: [PATCH] GenshinPlayer fix (for two issues) and updated sendmail with Magix's suggestions --- .../command/commands/SendMailCommand.java | 85 ++++++++++--------- .../emu/grasscutter/game/GenshinPlayer.java | 25 +----- .../PacketPlayerApplyEnterMpResultNotify.java | 3 +- 3 files changed, 49 insertions(+), 64 deletions(-) diff --git a/src/main/java/emu/grasscutter/command/commands/SendMailCommand.java b/src/main/java/emu/grasscutter/command/commands/SendMailCommand.java index d8f0fd542..7973bafbe 100644 --- a/src/main/java/emu/grasscutter/command/commands/SendMailCommand.java +++ b/src/main/java/emu/grasscutter/command/commands/SendMailCommand.java @@ -37,16 +37,15 @@ public class SendMailCommand implements CommandHandler { if (!mailBeingConstructed.containsKey(senderId)) { switch (args.size()) { - case 1: + case 1 -> { MailBuilder mailBuilder; switch (args.get(0).toLowerCase()) { - case "help": + case "help" -> { CommandHandler.sendMessage(sender, this.getClass().getAnnotation(Command.class).description() + "\nUsage: " + this.getClass().getAnnotation(Command.class).usage()); return; - case "all": - mailBuilder = new MailBuilder(true, new Mail()); - break; - default: + } + case "all" -> mailBuilder = new MailBuilder(true, new Mail()); + default -> { if (DatabaseHelper.getPlayerById(Integer.parseInt(args.get(0))) != null) { mailBuilder = new MailBuilder(Integer.parseInt(args.get(0)), new Mail()); break; @@ -54,29 +53,27 @@ public class SendMailCommand implements CommandHandler { CommandHandler.sendMessage(sender, "The user with an id of '" + args.get(0) + "' does not exist"); return; } + } } mailBeingConstructed.put(senderId, mailBuilder); CommandHandler.sendMessage(sender, "Starting composition of message.\nPlease use `/sendmail ` to continue.\nYou can use `/sendmail stop` at any time"); - break; - case 2: - CommandHandler.sendMessage(sender, "Mail templates coming soon implemented..."); - return; - default: - CommandHandler.sendMessage(sender, "Invalid arguments.\nUsage `/sendmail <userId|all|help> [templateId]`"); - return; + } + case 2 -> CommandHandler.sendMessage(sender, "Mail templates coming soon implemented..."); + default -> CommandHandler.sendMessage(sender, "Invalid arguments.\nUsage `/sendmail <userId|all|help> [templateId]`"); } } else { MailBuilder mailBuilder = mailBeingConstructed.get(senderId); if (args.size() >= 1) { switch (args.get(0).toLowerCase()) { - case "stop": + case "stop" -> { mailBeingConstructed.remove(senderId); CommandHandler.sendMessage(sender, "Message sending cancelled"); return; - case "finish": + } + case "finish" -> { if (mailBuilder.constructionStage == 3) { - if(mailBuilder.sendToAll == false) { + if (mailBuilder.sendToAll == false) { Grasscutter.getGameServer().getPlayerByUid(mailBuilder.recipient, true).sendMail(mailBuilder.mail); CommandHandler.sendMessage(sender, "Message sent to user " + mailBuilder.recipient + "!"); } else { @@ -90,37 +87,40 @@ public class SendMailCommand implements CommandHandler { CommandHandler.sendMessage(sender, "Message composition not at final stage.\nPlease use `/sendmail " + getConstructionArgs(mailBuilder.constructionStage) + "` or `/sendmail stop` to cancel"); } return; - case "help": + } + case "help" -> { CommandHandler.sendMessage(sender, "Please use `/sendmail " + getConstructionArgs(mailBuilder.constructionStage) + "`"); return; - default: + } + default -> { switch (mailBuilder.constructionStage) { - case 0: + case 0 -> { String title = String.join(" ", args.subList(0, args.size())); mailBuilder.mail.mailContent.title = title; CommandHandler.sendMessage(sender, "Message title set as '" + title + "'.\nUse '/sendmail <content>' to continue."); mailBuilder.constructionStage++; - break; - case 1: + } + case 1 -> { String contents = String.join(" ", args.subList(0, args.size())); mailBuilder.mail.mailContent.content = contents; CommandHandler.sendMessage(sender, "Message contents set as '" + contents + "'.\nUse '/sendmail <sender>' to continue."); mailBuilder.constructionStage++; - break; - case 2: + } + case 2 -> { String msgSender = String.join(" ", args.subList(0, args.size())); mailBuilder.mail.mailContent.sender = msgSender; CommandHandler.sendMessage(sender, "Message sender set as '" + msgSender + "'.\nUse '/sendmail <itemId|itemName|finish> [amount] [level]' to continue."); mailBuilder.constructionStage++; - break; - case 3: + } + case 3 -> { // Literally just copy-pasted from the give command lol. int item, lvl, amount = 1; switch (args.size()) { - default: // *No args* + default -> { // *No args* CommandHandler.sendMessage(sender, "Usage: give [player] <itemId|itemName> [amount]"); return; - case 1: // <itemId|itemName> + } + case 1 -> { // <itemId|itemName> try { item = Integer.parseInt(args.get(0)); lvl = 1; @@ -129,13 +129,13 @@ public class SendMailCommand implements CommandHandler { CommandHandler.sendMessage(sender, "Invalid item id."); return; } - break; - case 2: // <itemId|itemName> [amount] + } + case 2 -> { // <itemId|itemName> [amount] lvl = 1; item = Integer.parseInt(args.get(0)); amount = Integer.parseInt(args.get(1)); - break; - case 3: // <itemId|itemName> [amount] [level] + } + case 3 -> { // <itemId|itemName> [amount] [level] try { item = Integer.parseInt(args.get(0)); amount = Integer.parseInt(args.get(1)); @@ -146,12 +146,13 @@ public class SendMailCommand implements CommandHandler { CommandHandler.sendMessage(sender, "Invalid item or player ID."); return; } - break; + } } mailBuilder.mail.itemList.add(new Mail.MailItem(item, amount, lvl)); CommandHandler.sendMessage(sender, String.format("Attached %s of %s (level %s) to the message.\nContinue adding more items or use `/sendmail finish` to send the message.", amount, item, lvl)); + } } - break; + } } } else { CommandHandler.sendMessage(sender, "Invalid arguments \n Please use `/sendmail " + getConstructionArgs(mailBuilder.constructionStage)); @@ -159,19 +160,25 @@ public class SendMailCommand implements CommandHandler { } } - public String getConstructionArgs(int stage) { + private String getConstructionArgs(int stage) { switch (stage) { - case 0: + case 0 -> { return "<title>"; - case 1: + } + case 1 -> { return "<message>"; - case 2: + } + case 2 -> { return "<sender>"; - case 3: + + } + case 3 -> { return "<itemId|itemName|finish> [amount] [level]"; - default: + } + default -> { Thread.dumpStack(); return "ERROR: invalid construction stage " + stage + ". Check console for stacktrace."; + } } } diff --git a/src/main/java/emu/grasscutter/game/GenshinPlayer.java b/src/main/java/emu/grasscutter/game/GenshinPlayer.java index 5a5b74111..490a8dbdc 100644 --- a/src/main/java/emu/grasscutter/game/GenshinPlayer.java +++ b/src/main/java/emu/grasscutter/game/GenshinPlayer.java @@ -37,30 +37,7 @@ import emu.grasscutter.net.proto.PlayerWorldLocationInfoOuterClass; import emu.grasscutter.net.proto.SocialDetailOuterClass.SocialDetail; import emu.grasscutter.server.game.GameServer; import emu.grasscutter.server.game.GameSession; -import emu.grasscutter.server.packet.send.PacketAbilityInvocationsNotify; -import emu.grasscutter.server.packet.send.PacketAvatarAddNotify; -import emu.grasscutter.server.packet.send.PacketAvatarDataNotify; -import emu.grasscutter.server.packet.send.PacketAvatarGainCostumeNotify; -import emu.grasscutter.server.packet.send.PacketAvatarGainFlycloakNotify; -import emu.grasscutter.server.packet.send.PacketClientAbilityInitFinishNotify; -import emu.grasscutter.server.packet.send.PacketCombatInvocationsNotify; -import emu.grasscutter.server.packet.send.PacketGadgetInteractRsp; -import emu.grasscutter.server.packet.send.PacketItemAddHintNotify; -import emu.grasscutter.server.packet.send.PacketOpenStateUpdateNotify; -import emu.grasscutter.server.packet.send.PacketPlayerApplyEnterMpResultNotify; -import emu.grasscutter.server.packet.send.PacketPlayerDataNotify; -import emu.grasscutter.server.packet.send.PacketPlayerEnterSceneNotify; -import emu.grasscutter.server.packet.send.PacketPlayerPropNotify; -import emu.grasscutter.server.packet.send.PacketPlayerStoreNotify; -import emu.grasscutter.server.packet.send.PacketPrivateChatNotify; -import emu.grasscutter.server.packet.send.PacketScenePlayerLocationNotify; -import emu.grasscutter.server.packet.send.PacketPlayerLevelRewardUpdateNotify; -import emu.grasscutter.server.packet.send.PacketSetNameCardRsp; -import emu.grasscutter.server.packet.send.PacketStoreWeightLimitNotify; -import emu.grasscutter.server.packet.send.PacketUnlockNameCardNotify; -import emu.grasscutter.server.packet.send.PacketWorldPlayerLocationNotify; -import emu.grasscutter.server.packet.send.PacketWorldPlayerRTTNotify; -import emu.grasscutter.server.packet.send.PacketMailChangeNotify; +import emu.grasscutter.server.packet.send.*; import emu.grasscutter.utils.Position; import emu.grasscutter.utils.DateHelper; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java index c55ee3b12..e164b5d0b 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketPlayerApplyEnterMpResultNotify.java @@ -4,11 +4,12 @@ import emu.grasscutter.game.GenshinPlayer; import emu.grasscutter.net.packet.GenshinPacket; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.proto.PlayerApplyEnterMpReasonOuterClass.PlayerApplyEnterMpReason; +import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass; import emu.grasscutter.net.proto.PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify; public class PacketPlayerApplyEnterMpResultNotify extends GenshinPacket { - public PacketPlayerApplyEnterMpResultNotify(GenshinPlayer target, boolean isAgreed, PlayerApplyEnterMpResultNotify.Reason reason) { + public PacketPlayerApplyEnterMpResultNotify(GenshinPlayer target, boolean isAgreed, PlayerApplyEnterMpResultNotifyOuterClass.PlayerApplyEnterMpResultNotify.Reason reason) { super(PacketOpcodes.PlayerApplyEnterMpResultNotify); PlayerApplyEnterMpResultNotify proto = PlayerApplyEnterMpResultNotify.newBuilder()