From fcabf42d9a2ccdcd3cb290dd8c2beb1f67753044 Mon Sep 17 00:00:00 2001 From: zhaodice <63996691+zhaodice@users.noreply.github.com> Date: Thu, 30 Jun 2022 05:33:21 +0800 Subject: [PATCH] Fireworks support (#1393) * Firework Implement * add legacy function * remove obfusucated names * remove obfusucated names * remove obfusucated names * remove obfusucated names Co-authored-by: Melledy <52122272+Melledy@users.noreply.github.com> --- proto/FireWorkData.proto | 10 +++++++ proto/FireWorkInstance.proto | 10 +++++++ proto/FireWorkNotify.proto | 12 +++++++++ proto/FireWorkReq.proto | 13 ++++++++++ proto/FireWorkRsp.proto | 10 +++++++ proto/FireWorkType.proto | 12 +++++++++ proto/FireworkSetData.proto | 11 ++++++++ proto/FireworkSetNotify.proto | 13 ++++++++++ proto/FireworkSetReq.proto | 13 ++++++++++ proto/FireworkSetRsp.proto | 10 +++++++ .../grasscutter/net/packet/PacketOpcodes.java | 11 ++++++++ .../packet/recv/HandlerFireWorkReq.java | 21 +++++++++++++++ .../packet/recv/HandlerFireworkSetReq.java | 23 ++++++++++++++++ .../packet/recv/HandlerWidgetDoBagReq.java | 26 +++++++++++++++---- .../packet/send/PacketFireworkNotify.java | 21 +++++++++++++++ .../server/packet/send/PacketFireworkRsp.java | 12 +++++++++ .../packet/send/PacketFireworkSetNotify.java | 21 +++++++++++++++ .../packet/send/PacketFireworkSetRsp.java | 13 ++++++++++ .../send/PacketWidgetGadgetDataNotify.java | 16 ++++++++++++ 19 files changed, 273 insertions(+), 5 deletions(-) create mode 100644 proto/FireWorkData.proto create mode 100644 proto/FireWorkInstance.proto create mode 100644 proto/FireWorkNotify.proto create mode 100644 proto/FireWorkReq.proto create mode 100644 proto/FireWorkRsp.proto create mode 100644 proto/FireWorkType.proto create mode 100644 proto/FireworkSetData.proto create mode 100644 proto/FireworkSetNotify.proto create mode 100644 proto/FireworkSetReq.proto create mode 100644 proto/FireworkSetRsp.proto create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerFireWorkReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerFireworkSetReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketFireworkNotify.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketFireworkRsp.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetNotify.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetRsp.java diff --git a/proto/FireWorkData.proto b/proto/FireWorkData.proto new file mode 100644 index 000000000..888e24711 --- /dev/null +++ b/proto/FireWorkData.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireWorkInstance.proto"; + +message FireWorkData { + uint32 id = 1; + repeated FireWorkInstance fireWorkInstance = 2; +} diff --git a/proto/FireWorkInstance.proto b/proto/FireWorkInstance.proto new file mode 100644 index 000000000..3435b84f1 --- /dev/null +++ b/proto/FireWorkInstance.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireWorkType.proto"; + +message FireWorkInstance { + FireWorkType type = 1; + int32 value = 2; +} diff --git a/proto/FireWorkNotify.proto b/proto/FireWorkNotify.proto new file mode 100644 index 000000000..030eb2e10 --- /dev/null +++ b/proto/FireWorkNotify.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireWorkData.proto"; + +// CmdId: 6079 +// EnetChannelId: 0 +// EnetIsReliable: true +message FireWorkNotify { + repeated FireWorkData fireWorkData = 1; +} diff --git a/proto/FireWorkReq.proto b/proto/FireWorkReq.proto new file mode 100644 index 000000000..6fa8aeb78 --- /dev/null +++ b/proto/FireWorkReq.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireWorkData.proto"; + +// CmdId: 6068 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message FireWorkReq { + FireWorkData fireWorkData = 7; +} diff --git a/proto/FireWorkRsp.proto b/proto/FireWorkRsp.proto new file mode 100644 index 000000000..f5d9ec188 --- /dev/null +++ b/proto/FireWorkRsp.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 5918 +// EnetChannelId: 0 +// EnetIsReliable: true +message FireWorkRsp { + int32 retcode = 10; +} diff --git a/proto/FireWorkType.proto b/proto/FireWorkType.proto new file mode 100644 index 000000000..1b37fa937 --- /dev/null +++ b/proto/FireWorkType.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +enum FireWorkType { + FireWorkType_ODJKANKMPPJ = 0; + FireWorkType_EFGLHEIODFN = 1; + FireWorkType_JPBBBCFGHAK = 2; + FireWorkType_IDCMGHBHBFH = 3; + FireWorkType_ODDBNNDFMBO = 4; + FireWorkType_AGIDMOGJOBD = 5; +} diff --git a/proto/FireworkSetData.proto b/proto/FireworkSetData.proto new file mode 100644 index 000000000..b06a0fba3 --- /dev/null +++ b/proto/FireworkSetData.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireWorkInstance.proto"; + +message FireworkSetData { + uint32 id = 1; + repeated uint32 _unknown_field_ = 2; + repeated FireWorkInstance fireWorkInstance = 3; +} diff --git a/proto/FireworkSetNotify.proto b/proto/FireworkSetNotify.proto new file mode 100644 index 000000000..f002a41a7 --- /dev/null +++ b/proto/FireworkSetNotify.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireworkSetData.proto"; + +// CmdId: 5934 +// EnetChannelId: 0 +// EnetIsReliable: true +message FireworkSetNotify { + uint32 code = 1; + repeated FireworkSetData data = 9; +} diff --git a/proto/FireworkSetReq.proto b/proto/FireworkSetReq.proto new file mode 100644 index 000000000..d8014b3d9 --- /dev/null +++ b/proto/FireworkSetReq.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "FireworkSetData.proto"; + +// CmdId: 6099 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message FireworkSetReq { + FireworkSetData data = 2; +} diff --git a/proto/FireworkSetRsp.proto b/proto/FireworkSetRsp.proto new file mode 100644 index 000000000..b4ac1ffc7 --- /dev/null +++ b/proto/FireworkSetRsp.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 5969 +// EnetChannelId: 0 +// EnetIsReliable: true +message NBFJOJPCCEK_Rsp { + int32 retcode = 7; +} diff --git a/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java b/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java index 1ea2a46fa..41c10fcf2 100644 --- a/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java +++ b/src/main/java/emu/grasscutter/net/packet/PacketOpcodes.java @@ -471,6 +471,12 @@ public class PacketOpcodes { public static final int FinishedParentQuestUpdateNotify = 432; public static final int FinishMainCoopReq = 1978; public static final int FinishMainCoopRsp = 1953; + public static final int FireworkReq = 6068; + public static final int FireworkNotify = 6079; + public static final int FireworkRsp = 5918; + public static final int FireworkSetReq = 6099; + public static final int FireworkSetNotify = 5934; + public static final int FireworkSetRsp = 5969; public static final int FishAttractNotify = 5846; public static final int FishBaitGoneNotify = 5827; public static final int FishBattleBeginReq = 5802; @@ -909,6 +915,11 @@ public class PacketOpcodes { public static final int MusicGameSettleRsp = 8288; public static final int MusicGameStartReq = 8927; public static final int MusicGameStartRsp = 8101; + public static final int MusicCustomReq = 6318; + public static final int MusicCustomRsp = 6309; + public static final int MusicGameStoreSubmitReq = 6326; + public static final int MusicGameStoreSubmitRsp = 6347; + public static final int MusicGameStoreSubmitNotify = 6337; public static final int MusicGameStartToPlayOthersBeatmapReq = 6302; public static final int MusicGameStartToPlayOthersBeatmapRsp = 6313; public static final int NavMeshStatsNotify = 2387; diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerFireWorkReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerFireWorkReq.java new file mode 100644 index 000000000..aa7ea26e2 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerFireWorkReq.java @@ -0,0 +1,21 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.FireWorkReqOuterClass; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketFireworkNotify; +import emu.grasscutter.server.packet.send.PacketFireworkRsp; + +@Opcodes(PacketOpcodes.FireworkReq) +public class HandlerFireWorkReq extends PacketHandler { + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + + var req + = FireWorkReqOuterClass.FireWorkReq.parseFrom(payload); + session.send(new PacketFireworkNotify(req.getFireWorkData())); + session.send(new PacketFireworkRsp()); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerFireworkSetReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerFireworkSetReq.java new file mode 100644 index 000000000..ade4f4ced --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerFireworkSetReq.java @@ -0,0 +1,23 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.FireworkSetReqOuterClass; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketFireworkSetNotify; +import emu.grasscutter.server.packet.send.PacketFireworkSetRsp; + +@Opcodes(PacketOpcodes.FireworkSetReq) +public class HandlerFireworkSetReq extends PacketHandler { + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + + var req + = FireworkSetReqOuterClass.FireworkSetReq.parseFrom(payload); + + + session.send(new PacketFireworkSetNotify(req.getData())); + session.send(new PacketFireworkSetRsp()); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerWidgetDoBagReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerWidgetDoBagReq.java index c73f98fbd..bdf3a2d21 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerWidgetDoBagReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerWidgetDoBagReq.java @@ -1,17 +1,14 @@ package emu.grasscutter.server.packet.recv; -import emu.grasscutter.Grasscutter; import emu.grasscutter.data.GameData; import emu.grasscutter.data.excels.GadgetData; import emu.grasscutter.game.entity.EntityVehicle; import emu.grasscutter.game.entity.GameEntity; -import emu.grasscutter.game.props.LifeState; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.net.packet.PacketOpcodes; -import emu.grasscutter.net.proto.*; +import emu.grasscutter.net.proto.WidgetDoBagReqOuterClass; import emu.grasscutter.server.game.GameSession; -import emu.grasscutter.server.packet.send.PacketSceneEntityAppearNotify; import emu.grasscutter.server.packet.send.PacketWidgetCoolDownNotify; import emu.grasscutter.server.packet.send.PacketWidgetDoBagRsp; import emu.grasscutter.server.packet.send.PacketWidgetGadgetDataNotify; @@ -41,12 +38,31 @@ public class HandlerWidgetDoBagReq extends PacketHandler { session.getPlayer().getScene().addEntity(entity); - session.send(new PacketWidgetGadgetDataNotify(70500025, List.of(entity.getId()))); // ??? + session.send(new PacketWidgetGadgetDataNotify(70500025, entity.getId())); // ??? session.send(new PacketWidgetCoolDownNotify(15, System.currentTimeMillis() + 5000L, true)); session.send(new PacketWidgetCoolDownNotify(15, System.currentTimeMillis() + 5000L, true)); // Send twice, and I don't know why, Ask mhy session.send(new PacketWidgetDoBagRsp()); } + case 220047 -> { + GadgetData gadgetData = GameData.getGadgetDataMap().get(70800058); + Position pos = new Position(req.getWidgetCreatorInfo().getLocationInfo().getPos()); + Position rot = new Position(req.getWidgetCreatorInfo().getLocationInfo().getRot()); + GameEntity entity = new EntityVehicle( + session.getPlayer().getScene(), + session.getPlayer(), + gadgetData.getId(), + 0, + pos, + rot + ); + + session.getPlayer().getScene().addEntity(entity); + + session.send(new PacketWidgetGadgetDataNotify(70800058, entity.getId())); // ??? + // Send twice, and I don't know why, Ask mhy + session.send(new PacketWidgetDoBagRsp()); + } default -> { session.send(new PacketWidgetDoBagRsp()); } diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkNotify.java new file mode 100644 index 000000000..059194b02 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkNotify.java @@ -0,0 +1,21 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.FireWorkNotifyOuterClass; +import emu.grasscutter.net.proto.FireWorkDataOuterClass; + +public class PacketFireworkNotify extends BasePacket { + + public PacketFireworkNotify(FireWorkDataOuterClass.FireWorkData pinfo) { + super(PacketOpcodes.FireworkNotify); + + var proto + = FireWorkNotifyOuterClass.FireWorkNotify.newBuilder(); + + proto.addFireWorkData(pinfo); + + setData(proto.build()); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkRsp.java new file mode 100644 index 000000000..e5c7b3498 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkRsp.java @@ -0,0 +1,12 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; + +public class PacketFireworkRsp extends BasePacket { + + public PacketFireworkRsp() { + super(PacketOpcodes.FireworkRsp); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetNotify.java new file mode 100644 index 000000000..678573380 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetNotify.java @@ -0,0 +1,21 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.FireworkSetNotifyOuterClass; +import emu.grasscutter.net.proto.FireworkSetDataOuterClass; + +public class PacketFireworkSetNotify extends BasePacket { + + public PacketFireworkSetNotify(FireworkSetDataOuterClass.FireworkSetData notify) { + super(PacketOpcodes.FireworkSetNotify); + + var proto + = FireworkSetNotifyOuterClass.FireworkSetNotify.newBuilder(); + + proto.setCode(1).addData(notify); + + setData(proto.build()); + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetRsp.java new file mode 100644 index 000000000..aad309164 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketFireworkSetRsp.java @@ -0,0 +1,13 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; + +public class PacketFireworkSetRsp extends BasePacket { + + public PacketFireworkSetRsp() { + super(PacketOpcodes.FireworkSetRsp); + + } + +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetDataNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetDataNotify.java index f94c6c10e..b8c777b85 100644 --- a/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetDataNotify.java +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetDataNotify.java @@ -9,6 +9,7 @@ import java.io.IOException; import java.util.List; public class PacketWidgetGadgetDataNotify extends BasePacket { + public PacketWidgetGadgetDataNotify(int gadgetId, List gadgetEntityIdList) throws IOException { super(PacketOpcodes.WidgetGadgetDataNotify); @@ -23,4 +24,19 @@ public class PacketWidgetGadgetDataNotify extends BasePacket { this.setData(proto); } + + public PacketWidgetGadgetDataNotify(int gadgetId, int gadgetEntityIdList) throws IOException { + super(PacketOpcodes.WidgetGadgetDataNotify); + + WidgetGadgetDataNotifyOuterClass.WidgetGadgetDataNotify proto = WidgetGadgetDataNotifyOuterClass.WidgetGadgetDataNotify.newBuilder() + .setWidgetGadgetData( + WidgetGadgetDataOuterClass.WidgetGadgetData.newBuilder() + .setGadgetId(gadgetId) + .addGadgetEntityIdList(gadgetEntityIdList) + .build() + ) + .build(); + + this.setData(proto); + } }