From 401b80060ef60879046ce1b7a1979a75f00d0075 Mon Sep 17 00:00:00 2001 From: Yazawazi <47273265+Yazawazi@users.noreply.github.com> Date: Thu, 12 May 2022 16:06:59 +0800 Subject: [PATCH] feature(widget): simple implementation of widget Simple implementation of a part of the gadget support, very rough, hard code variables, I am very sorry for that. It can now handle part of the gadget rig. More features and better support await PRs from others. if no one else does, I'll give it a try. --- proto/AbilityMixinWidgetMpSupport.proto | 8 +++ proto/AllWidgetDataNotify.proto | 29 +++++++++ proto/AnchorPointData.proto | 12 ++++ proto/AnchorPointDataNotify.proto | 18 ++++++ proto/AnchorPointOpReq.proto | 24 ++++++++ proto/AnchorPointOpRsp.proto | 18 ++++++ proto/ClientCollectorData.proto | 10 ++++ proto/ClientCollectorDataNotify.proto | 17 ++++++ proto/GetWidgetSlotReq.proto | 16 +++++ proto/GetWidgetSlotRsp.proto | 18 ++++++ proto/LunchBoxData.proto | 8 +++ proto/LunchBoxSlotType.proto | 9 +++ proto/OneoffGatherPointDetectorData.proto | 15 +++++ .../OneoffGatherPointDetectorDataNotify.proto | 17 ++++++ proto/QuickUseWidgetReq.proto | 26 ++++++++ proto/QuickUseWidgetRsp.proto | 21 +++++++ proto/SetUpLunchBoxWidgetReq.proto | 18 ++++++ proto/SetUpLunchBoxWidgetRsp.proto | 18 ++++++ proto/SetWidgetSlotReq.proto | 21 +++++++ proto/SetWidgetSlotRsp.proto | 21 +++++++ proto/UseWidgetCreateGadgetReq.proto | 20 +++++++ proto/UseWidgetCreateGadgetRsp.proto | 17 ++++++ proto/UseWidgetRetractGadgetReq.proto | 17 ++++++ proto/UseWidgetRetractGadgetRsp.proto | 18 ++++++ proto/WidgetActiveChangeNotify.proto | 17 ++++++ proto/WidgetCameraInfo.proto | 8 +++ proto/WidgetCoolDownData.proto | 10 ++++ proto/WidgetCoolDownNotify.proto | 18 ++++++ proto/WidgetCreateLocationInfo.proto | 10 ++++ proto/WidgetCreatorInfo.proto | 12 ++++ proto/WidgetCreatorOpType.proto | 9 +++ proto/WidgetDoBagReq.proto | 23 ++++++++ proto/WidgetDoBagRsp.proto | 17 ++++++ proto/WidgetGadgetAllDataNotify.proto | 17 ++++++ proto/WidgetGadgetData.proto | 9 +++ proto/WidgetGadgetDataNotify.proto | 17 ++++++ proto/WidgetGadgetDestroyNotify.proto | 16 +++++ proto/WidgetReportReq.proto | 19 ++++++ proto/WidgetReportRsp.proto | 17 ++++++ proto/WidgetSlotChangeNotify.proto | 19 ++++++ proto/WidgetSlotData.proto | 12 ++++ proto/WidgetSlotOp.proto | 8 +++ proto/WidgetSlotTag.proto | 8 +++ proto/WidgetSlotTagComparer.proto | 7 +++ proto/WidgetThunderBirdFeatherInfo.proto | 8 +++ ...getUseAttachAbilityGroupChangeNotify.proto | 17 ++++++ .../emu/grasscutter/game/player/Player.java | 13 ++++ .../packet/recv/HandlerGetWidgetSlotReq.java | 6 +- .../packet/recv/HandlerSetWidgetSlotReq.java | 33 +++++++++++ .../send/PacketAllWidgetDataNotify.java | 59 +++++++++++++++++++ .../packet/send/PacketGetWidgetSlotRsp.java | 41 +++++++++++++ .../packet/send/PacketSetWidgetSlotRsp.java | 18 ++++++ .../send/PacketWidgetGadgetAllDataNotify.java | 16 +++++ .../send/PacketWidgetSlotChangeNotify.java | 47 +++++++++++++++ 54 files changed, 946 insertions(+), 1 deletion(-) create mode 100644 proto/AbilityMixinWidgetMpSupport.proto create mode 100644 proto/AllWidgetDataNotify.proto create mode 100644 proto/AnchorPointData.proto create mode 100644 proto/AnchorPointDataNotify.proto create mode 100644 proto/AnchorPointOpReq.proto create mode 100644 proto/AnchorPointOpRsp.proto create mode 100644 proto/ClientCollectorData.proto create mode 100644 proto/ClientCollectorDataNotify.proto create mode 100644 proto/GetWidgetSlotReq.proto create mode 100644 proto/GetWidgetSlotRsp.proto create mode 100644 proto/LunchBoxData.proto create mode 100644 proto/LunchBoxSlotType.proto create mode 100644 proto/OneoffGatherPointDetectorData.proto create mode 100644 proto/OneoffGatherPointDetectorDataNotify.proto create mode 100644 proto/QuickUseWidgetReq.proto create mode 100644 proto/QuickUseWidgetRsp.proto create mode 100644 proto/SetUpLunchBoxWidgetReq.proto create mode 100644 proto/SetUpLunchBoxWidgetRsp.proto create mode 100644 proto/SetWidgetSlotReq.proto create mode 100644 proto/SetWidgetSlotRsp.proto create mode 100644 proto/UseWidgetCreateGadgetReq.proto create mode 100644 proto/UseWidgetCreateGadgetRsp.proto create mode 100644 proto/UseWidgetRetractGadgetReq.proto create mode 100644 proto/UseWidgetRetractGadgetRsp.proto create mode 100644 proto/WidgetActiveChangeNotify.proto create mode 100644 proto/WidgetCameraInfo.proto create mode 100644 proto/WidgetCoolDownData.proto create mode 100644 proto/WidgetCoolDownNotify.proto create mode 100644 proto/WidgetCreateLocationInfo.proto create mode 100644 proto/WidgetCreatorInfo.proto create mode 100644 proto/WidgetCreatorOpType.proto create mode 100644 proto/WidgetDoBagReq.proto create mode 100644 proto/WidgetDoBagRsp.proto create mode 100644 proto/WidgetGadgetAllDataNotify.proto create mode 100644 proto/WidgetGadgetData.proto create mode 100644 proto/WidgetGadgetDataNotify.proto create mode 100644 proto/WidgetGadgetDestroyNotify.proto create mode 100644 proto/WidgetReportReq.proto create mode 100644 proto/WidgetReportRsp.proto create mode 100644 proto/WidgetSlotChangeNotify.proto create mode 100644 proto/WidgetSlotData.proto create mode 100644 proto/WidgetSlotOp.proto create mode 100644 proto/WidgetSlotTag.proto create mode 100644 proto/WidgetSlotTagComparer.proto create mode 100644 proto/WidgetThunderBirdFeatherInfo.proto create mode 100644 proto/WidgetUseAttachAbilityGroupChangeNotify.proto create mode 100644 src/main/java/emu/grasscutter/server/packet/recv/HandlerSetWidgetSlotReq.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketAllWidgetDataNotify.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketGetWidgetSlotRsp.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketSetWidgetSlotRsp.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetAllDataNotify.java create mode 100644 src/main/java/emu/grasscutter/server/packet/send/PacketWidgetSlotChangeNotify.java diff --git a/proto/AbilityMixinWidgetMpSupport.proto b/proto/AbilityMixinWidgetMpSupport.proto new file mode 100644 index 000000000..e5323e892 --- /dev/null +++ b/proto/AbilityMixinWidgetMpSupport.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message AbilityMixinWidgetMpSupport { + uint32 target_entity_id = 1; +} diff --git a/proto/AllWidgetDataNotify.proto b/proto/AllWidgetDataNotify.proto new file mode 100644 index 000000000..252d56ce0 --- /dev/null +++ b/proto/AllWidgetDataNotify.proto @@ -0,0 +1,29 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "LunchBoxData.proto"; +import "AnchorPointData.proto"; +import "OneoffGatherPointDetectorData.proto"; +import "ClientCollectorData.proto"; +import "WidgetCoolDownData.proto"; +import "WidgetSlotData.proto"; + +message AllWidgetDataNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4260; + } + + repeated AnchorPointData anchor_point_list = 2; + uint32 next_anchor_point_usable_time = 3; + LunchBoxData lunch_box_data = 5; + repeated OneoffGatherPointDetectorData oneoff_gather_point_detector_data_list = 6; + repeated ClientCollectorData client_collector_data_list = 7; + repeated WidgetCoolDownData cool_down_group_data_list = 8; + repeated WidgetCoolDownData normal_cool_down_data_list = 9; + repeated WidgetSlotData slot_list = 11; +} diff --git a/proto/AnchorPointData.proto b/proto/AnchorPointData.proto new file mode 100644 index 000000000..0bdbe0fef --- /dev/null +++ b/proto/AnchorPointData.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "Vector.proto"; + +message AnchorPointData { + uint32 anchor_point_id = 1; + Vector pos = 2; + Vector rot = 3; + uint32 end_time = 4; +} diff --git a/proto/AnchorPointDataNotify.proto b/proto/AnchorPointDataNotify.proto new file mode 100644 index 000000000..82153fd0d --- /dev/null +++ b/proto/AnchorPointDataNotify.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "AnchorPointData.proto"; + +message AnchorPointDataNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4253; + } + + repeated AnchorPointData anchor_point_list = 1; + uint32 next_usable_time = 2; +} diff --git a/proto/AnchorPointOpReq.proto b/proto/AnchorPointOpReq.proto new file mode 100644 index 000000000..2bfc2f3f7 --- /dev/null +++ b/proto/AnchorPointOpReq.proto @@ -0,0 +1,24 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message AnchorPointOpReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4255; + } + + enum AnchorPointOpType { + ANCHOR_POINT_OP_NONE = 0; + ANCHOR_POINT_OP_TELEPORT = 1; + ANCHOR_POINT_OP_REMOVE = 2; + } + + uint32 anchor_point_op_type = 1; + uint32 anchor_point_id = 2; +} diff --git a/proto/AnchorPointOpRsp.proto b/proto/AnchorPointOpRsp.proto new file mode 100644 index 000000000..c5ce92aff --- /dev/null +++ b/proto/AnchorPointOpRsp.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message AnchorPointOpRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4274; + } + + int32 retcode = 1; + uint32 anchor_point_op_type = 2; + uint32 anchor_point_id = 3; +} diff --git a/proto/ClientCollectorData.proto b/proto/ClientCollectorData.proto new file mode 100644 index 000000000..e342d76c4 --- /dev/null +++ b/proto/ClientCollectorData.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message ClientCollectorData { + uint32 material_id = 1; + uint32 max_points = 2; + uint32 curr_points = 3; +} diff --git a/proto/ClientCollectorDataNotify.proto b/proto/ClientCollectorDataNotify.proto new file mode 100644 index 000000000..6fcfbaa51 --- /dev/null +++ b/proto/ClientCollectorDataNotify.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "ClientCollectorData.proto"; + +message ClientCollectorDataNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4280; + } + + repeated ClientCollectorData client_collector_data_list = 1; +} diff --git a/proto/GetWidgetSlotReq.proto b/proto/GetWidgetSlotReq.proto new file mode 100644 index 000000000..cf43e24b4 --- /dev/null +++ b/proto/GetWidgetSlotReq.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message GetWidgetSlotReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4285; + } + +} diff --git a/proto/GetWidgetSlotRsp.proto b/proto/GetWidgetSlotRsp.proto new file mode 100644 index 000000000..96a00c35a --- /dev/null +++ b/proto/GetWidgetSlotRsp.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetSlotData.proto"; + +message GetWidgetSlotRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4291; + } + + int32 retcode = 1; + repeated WidgetSlotData slot_list = 2; +} diff --git a/proto/LunchBoxData.proto b/proto/LunchBoxData.proto new file mode 100644 index 000000000..dc099eb0f --- /dev/null +++ b/proto/LunchBoxData.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message LunchBoxData { + map slot_material_map = 1; +} diff --git a/proto/LunchBoxSlotType.proto b/proto/LunchBoxSlotType.proto new file mode 100644 index 000000000..f2ab1f56a --- /dev/null +++ b/proto/LunchBoxSlotType.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +enum LunchBoxSlotType { + LUNCH_BOX_SLOT_NONE = 0; + LUNCH_BOX_SLOT_REVIVE = 1; + LUNCH_BOX_SLOT_HEAL = 2; +} diff --git a/proto/OneoffGatherPointDetectorData.proto b/proto/OneoffGatherPointDetectorData.proto new file mode 100644 index 000000000..deec47762 --- /dev/null +++ b/proto/OneoffGatherPointDetectorData.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "Vector.proto"; + +message OneoffGatherPointDetectorData { + uint32 material_id = 1; + bool is_all_collected = 2; + bool is_hint_valid = 3; + Vector hint_center_pos = 4; + uint32 hint_radius = 5; + uint32 group_id = 6; + uint32 config_id = 7; +} diff --git a/proto/OneoffGatherPointDetectorDataNotify.proto b/proto/OneoffGatherPointDetectorDataNotify.proto new file mode 100644 index 000000000..d8911c232 --- /dev/null +++ b/proto/OneoffGatherPointDetectorDataNotify.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "OneoffGatherPointDetectorData.proto"; + +message OneoffGatherPointDetectorDataNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4288; + } + + repeated OneoffGatherPointDetectorData oneoff_gather_point_detector_data_list = 1; +} diff --git a/proto/QuickUseWidgetReq.proto b/proto/QuickUseWidgetReq.proto new file mode 100644 index 000000000..86b912c84 --- /dev/null +++ b/proto/QuickUseWidgetReq.proto @@ -0,0 +1,26 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetCreateLocationInfo.proto"; +import "WidgetCameraInfo.proto"; +import "WidgetCreatorInfo.proto"; +import "WidgetThunderBirdFeatherInfo.proto"; + +message QuickUseWidgetReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4300; + } + + oneof Param { + WidgetCreateLocationInfo location_info = 20; + WidgetCameraInfo camera_info = 21; + WidgetCreatorInfo creator_info = 22; + WidgetThunderBirdFeatherInfo thunder_bird_feather_info = 23; + } +} diff --git a/proto/QuickUseWidgetRsp.proto b/proto/QuickUseWidgetRsp.proto new file mode 100644 index 000000000..8a6f9a957 --- /dev/null +++ b/proto/QuickUseWidgetRsp.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "OneoffGatherPointDetectorData.proto"; +import "ClientCollectorData.proto"; + +message QuickUseWidgetRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4258; + } + + int32 retcode = 1; + uint32 material_id = 2; + OneoffGatherPointDetectorData detector_data = 3; + ClientCollectorData client_collector_data = 4; +} diff --git a/proto/SetUpLunchBoxWidgetReq.proto b/proto/SetUpLunchBoxWidgetReq.proto new file mode 100644 index 000000000..a3e0293c3 --- /dev/null +++ b/proto/SetUpLunchBoxWidgetReq.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "LunchBoxData.proto"; + +message SetUpLunchBoxWidgetReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4265; + } + + LunchBoxData lunch_box_data = 1; +} diff --git a/proto/SetUpLunchBoxWidgetRsp.proto b/proto/SetUpLunchBoxWidgetRsp.proto new file mode 100644 index 000000000..e2c70dd0f --- /dev/null +++ b/proto/SetUpLunchBoxWidgetRsp.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "LunchBoxData.proto"; + +message SetUpLunchBoxWidgetRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4297; + } + + int32 retcode = 1; + LunchBoxData lunch_box_data = 2; +} diff --git a/proto/SetWidgetSlotReq.proto b/proto/SetWidgetSlotReq.proto new file mode 100644 index 000000000..2d140a528 --- /dev/null +++ b/proto/SetWidgetSlotReq.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetSlotOp.proto"; +import "WidgetSlotTag.proto"; + +message SetWidgetSlotReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4269; + } + + WidgetSlotOp op = 2; + repeated WidgetSlotTag tag_list = 3; + uint32 material_id = 4; +} diff --git a/proto/SetWidgetSlotRsp.proto b/proto/SetWidgetSlotRsp.proto new file mode 100644 index 000000000..7d7b34a3e --- /dev/null +++ b/proto/SetWidgetSlotRsp.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetSlotOp.proto"; +import "WidgetSlotTag.proto"; + +message SetWidgetSlotRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4279; + } + + int32 retcode = 1; + WidgetSlotOp op = 2; + repeated WidgetSlotTag tag_list = 3; + uint32 material_id = 4; +} diff --git a/proto/UseWidgetCreateGadgetReq.proto b/proto/UseWidgetCreateGadgetReq.proto new file mode 100644 index 000000000..4acc7696b --- /dev/null +++ b/proto/UseWidgetCreateGadgetReq.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "Vector.proto"; + +message UseWidgetCreateGadgetReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4276; + } + + uint32 material_id = 1; + Vector pos = 2; + Vector rot = 3; +} diff --git a/proto/UseWidgetCreateGadgetRsp.proto b/proto/UseWidgetCreateGadgetRsp.proto new file mode 100644 index 000000000..74c86f42c --- /dev/null +++ b/proto/UseWidgetCreateGadgetRsp.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message UseWidgetCreateGadgetRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4270; + } + + int32 retcode = 1; + uint32 material_id = 2; +} diff --git a/proto/UseWidgetRetractGadgetReq.proto b/proto/UseWidgetRetractGadgetReq.proto new file mode 100644 index 000000000..e7144ee76 --- /dev/null +++ b/proto/UseWidgetRetractGadgetReq.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message UseWidgetRetractGadgetReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4273; + } + + uint32 entity_id = 1; +} diff --git a/proto/UseWidgetRetractGadgetRsp.proto b/proto/UseWidgetRetractGadgetRsp.proto new file mode 100644 index 000000000..4bf69bbc9 --- /dev/null +++ b/proto/UseWidgetRetractGadgetRsp.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message UseWidgetRetractGadgetRsp { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4266; + } + + int32 retcode = 1; + uint32 entity_id = 2; +} diff --git a/proto/WidgetActiveChangeNotify.proto b/proto/WidgetActiveChangeNotify.proto new file mode 100644 index 000000000..ee5033438 --- /dev/null +++ b/proto/WidgetActiveChangeNotify.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetSlotData.proto"; + +message WidgetActiveChangeNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4264; + } + + repeated WidgetSlotData widget_data_list = 1; +} diff --git a/proto/WidgetCameraInfo.proto b/proto/WidgetCameraInfo.proto new file mode 100644 index 000000000..8f8d659af --- /dev/null +++ b/proto/WidgetCameraInfo.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetCameraInfo { + uint32 target_entity_id = 1; +} diff --git a/proto/WidgetCoolDownData.proto b/proto/WidgetCoolDownData.proto new file mode 100644 index 000000000..09b3d235f --- /dev/null +++ b/proto/WidgetCoolDownData.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetCoolDownData { + uint32 id = 1; + uint64 cool_down_time = 2; + bool is_success = 3; +} diff --git a/proto/WidgetCoolDownNotify.proto b/proto/WidgetCoolDownNotify.proto new file mode 100644 index 000000000..f034cc79f --- /dev/null +++ b/proto/WidgetCoolDownNotify.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetCoolDownData.proto"; + +message WidgetCoolDownNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4298; + } + + repeated WidgetCoolDownData group_cool_down_data_list = 1; + repeated WidgetCoolDownData normal_cool_down_data_list = 2; +} diff --git a/proto/WidgetCreateLocationInfo.proto b/proto/WidgetCreateLocationInfo.proto new file mode 100644 index 000000000..0f4c7178f --- /dev/null +++ b/proto/WidgetCreateLocationInfo.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "Vector.proto"; + +message WidgetCreateLocationInfo { + Vector pos = 1; + Vector rot = 2; +} diff --git a/proto/WidgetCreatorInfo.proto b/proto/WidgetCreatorInfo.proto new file mode 100644 index 000000000..1b277630c --- /dev/null +++ b/proto/WidgetCreatorInfo.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetCreatorOpType.proto"; +import "WidgetCreateLocationInfo.proto"; + +message WidgetCreatorInfo { + WidgetCreatorOpType op_type = 1; + uint32 entity_id = 2; + WidgetCreateLocationInfo location_info = 3; +} diff --git a/proto/WidgetCreatorOpType.proto b/proto/WidgetCreatorOpType.proto new file mode 100644 index 000000000..b2eaab3e3 --- /dev/null +++ b/proto/WidgetCreatorOpType.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +enum WidgetCreatorOpType { + WIDGET_CREATOR_TYPE_NONE = 0; + WIDGET_CREATOR_TYPE_RETRACT = 1; + WIDGET_CREATOR_TYPE_RETRACT_AND_CREATE = 2; +} diff --git a/proto/WidgetDoBagReq.proto b/proto/WidgetDoBagReq.proto new file mode 100644 index 000000000..cbdb3460d --- /dev/null +++ b/proto/WidgetDoBagReq.proto @@ -0,0 +1,23 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetCreateLocationInfo.proto"; +import "WidgetCreatorInfo.proto"; + +message WidgetDoBagReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4290; + } + + oneof OpInfo { + WidgetCreateLocationInfo location_info = 20; + WidgetCreatorInfo widget_creator_info = 21; + } + uint32 material_id = 1; +} diff --git a/proto/WidgetDoBagRsp.proto b/proto/WidgetDoBagRsp.proto new file mode 100644 index 000000000..898294d1d --- /dev/null +++ b/proto/WidgetDoBagRsp.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetDoBagRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4271; + } + + int32 retcode = 1; + uint32 material_id = 2; +} diff --git a/proto/WidgetGadgetAllDataNotify.proto b/proto/WidgetGadgetAllDataNotify.proto new file mode 100644 index 000000000..ea9034f37 --- /dev/null +++ b/proto/WidgetGadgetAllDataNotify.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetGadgetData.proto"; + +message WidgetGadgetAllDataNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4262; + } + + repeated WidgetGadgetData widget_gadget_data = 1; +} diff --git a/proto/WidgetGadgetData.proto b/proto/WidgetGadgetData.proto new file mode 100644 index 000000000..1c2756d21 --- /dev/null +++ b/proto/WidgetGadgetData.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetGadgetData { + uint32 gadget_id = 1; + repeated uint32 gadget_entity_id_list = 3; +} diff --git a/proto/WidgetGadgetDataNotify.proto b/proto/WidgetGadgetDataNotify.proto new file mode 100644 index 000000000..b056941c7 --- /dev/null +++ b/proto/WidgetGadgetDataNotify.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetGadgetData.proto"; + +message WidgetGadgetDataNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4256; + } + + WidgetGadgetData widget_gadget_data = 1; +} diff --git a/proto/WidgetGadgetDestroyNotify.proto b/proto/WidgetGadgetDestroyNotify.proto new file mode 100644 index 000000000..3d6287fc0 --- /dev/null +++ b/proto/WidgetGadgetDestroyNotify.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetGadgetDestroyNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4268; + } + + uint32 entity_id = 1; +} diff --git a/proto/WidgetReportReq.proto b/proto/WidgetReportReq.proto new file mode 100644 index 000000000..21eed4dfc --- /dev/null +++ b/proto/WidgetReportReq.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetReportReq { + enum CmdId { + option allow_alias = true; + ENET_CHANNEL_ID = 0; + NONE = 0; + ENET_IS_RELIABLE = 1; + IS_ALLOW_CLIENT = 1; + CMD_ID = 4294; + } + + uint32 material_id = 1; + bool is_clear_hint = 2; + bool is_client_collect = 3; +} diff --git a/proto/WidgetReportRsp.proto b/proto/WidgetReportRsp.proto new file mode 100644 index 000000000..3142df9b3 --- /dev/null +++ b/proto/WidgetReportRsp.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetReportRsp { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4259; + } + + int32 retcode = 1; + uint32 material_id = 2; +} diff --git a/proto/WidgetSlotChangeNotify.proto b/proto/WidgetSlotChangeNotify.proto new file mode 100644 index 000000000..3ef12560f --- /dev/null +++ b/proto/WidgetSlotChangeNotify.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetSlotOp.proto"; +import "WidgetSlotData.proto"; + +message WidgetSlotChangeNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4289; + } + + WidgetSlotOp op = 1; + WidgetSlotData slot = 2; +} diff --git a/proto/WidgetSlotData.proto b/proto/WidgetSlotData.proto new file mode 100644 index 000000000..095915d18 --- /dev/null +++ b/proto/WidgetSlotData.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "WidgetSlotTag.proto"; + +message WidgetSlotData { + WidgetSlotTag tag = 1; + uint32 material_id = 2; + uint32 cd_over_time = 3; + bool is_active = 4; +} diff --git a/proto/WidgetSlotOp.proto b/proto/WidgetSlotOp.proto new file mode 100644 index 000000000..d4fa27538 --- /dev/null +++ b/proto/WidgetSlotOp.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +enum WidgetSlotOp { + ATTACH = 0; + DETACH = 1; +} diff --git a/proto/WidgetSlotTag.proto b/proto/WidgetSlotTag.proto new file mode 100644 index 000000000..edfd6c06a --- /dev/null +++ b/proto/WidgetSlotTag.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +enum WidgetSlotTag { + WIDGET_SLOT_QUICK_USE = 0; + WIDGET_SLOT_ATTACH_AVATAR = 1; +} diff --git a/proto/WidgetSlotTagComparer.proto b/proto/WidgetSlotTagComparer.proto new file mode 100644 index 000000000..5f6253c17 --- /dev/null +++ b/proto/WidgetSlotTagComparer.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetSlotTagComparer { +} diff --git a/proto/WidgetThunderBirdFeatherInfo.proto b/proto/WidgetThunderBirdFeatherInfo.proto new file mode 100644 index 000000000..cad88c47a --- /dev/null +++ b/proto/WidgetThunderBirdFeatherInfo.proto @@ -0,0 +1,8 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetThunderBirdFeatherInfo { + repeated uint32 entity_id_list = 1; +} diff --git a/proto/WidgetUseAttachAbilityGroupChangeNotify.proto b/proto/WidgetUseAttachAbilityGroupChangeNotify.proto new file mode 100644 index 000000000..85fa84345 --- /dev/null +++ b/proto/WidgetUseAttachAbilityGroupChangeNotify.proto @@ -0,0 +1,17 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + + +message WidgetUseAttachAbilityGroupChangeNotify { + enum CmdId { + option allow_alias = true; + NONE = 0; + ENET_CHANNEL_ID = 0; + ENET_IS_RELIABLE = 1; + CMD_ID = 4292; + } + + uint32 material_id = 1; + bool is_attach = 2; +} diff --git a/src/main/java/emu/grasscutter/game/player/Player.java b/src/main/java/emu/grasscutter/game/player/Player.java index 58e500b97..0be6c7a54 100644 --- a/src/main/java/emu/grasscutter/game/player/Player.java +++ b/src/main/java/emu/grasscutter/game/player/Player.java @@ -82,6 +82,8 @@ public class Player { private Set flyCloakList; private Set costumeList; + private Integer widgetId; + @Transient private long nextGuid = 0; @Transient private int peerId; @Transient private World world; @@ -297,6 +299,14 @@ public class Player { this.updateProfile(); } + public Integer getWidgetId() { + return widgetId; + } + + public void setWidgetId(Integer widgetId) { + this.widgetId = widgetId; + } + public Position getPos() { return pos; } @@ -1141,6 +1151,9 @@ public class Player { session.send(new PacketPlayerStoreNotify(this)); session.send(new PacketAvatarDataNotify(this)); + session.send(new PacketAllWidgetDataNotify(this)); + session.send(new PacketWidgetGadgetAllDataNotify()); + getTodayMoonCard(); // The timer works at 0:0, some users log in after that, use this method to check if they have received a reward today or not. If not, send the reward. session.send(new PacketPlayerEnterSceneNotify(this)); // Enter game world diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetWidgetSlotReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetWidgetSlotReq.java index b41a6cc1d..e7b352122 100644 --- a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetWidgetSlotReq.java +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetWidgetSlotReq.java @@ -1,16 +1,20 @@ package emu.grasscutter.server.packet.recv; +import emu.grasscutter.game.player.Player; import emu.grasscutter.net.packet.Opcodes; import emu.grasscutter.net.packet.PacketOpcodes; import emu.grasscutter.net.packet.PacketHandler; import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketGetShopRsp; +import emu.grasscutter.server.packet.send.PacketGetWidgetSlotRsp; @Opcodes(PacketOpcodes.GetWidgetSlotReq) public class HandlerGetWidgetSlotReq extends PacketHandler { @Override public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { - // Unhandled + Player player = session.getPlayer(); + session.send(new PacketGetWidgetSlotRsp(player)); } } diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetWidgetSlotReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetWidgetSlotReq.java new file mode 100644 index 000000000..6f55e2ab9 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerSetWidgetSlotReq.java @@ -0,0 +1,33 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.SetWidgetSlotReqOuterClass; +import emu.grasscutter.net.proto.WidgetSlotOpOuterClass; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketSetWidgetSlotRsp; +import emu.grasscutter.server.packet.send.PacketWidgetSlotChangeNotify; + +@Opcodes(PacketOpcodes.SetWidgetSlotReq) +public class HandlerSetWidgetSlotReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + SetWidgetSlotReqOuterClass.SetWidgetSlotReq req = SetWidgetSlotReqOuterClass.SetWidgetSlotReq.parseFrom(payload); + + Player player = session.getPlayer(); + player.setWidgetId(req.getMaterialId()); + + // WidgetSlotChangeNotify op & slot key + session.send(new PacketWidgetSlotChangeNotify(WidgetSlotOpOuterClass.WidgetSlotOp.DETACH)); + // WidgetSlotChangeNotify slot + session.send(new PacketWidgetSlotChangeNotify(req.getMaterialId())); + + // SetWidgetSlotRsp + session.send(new PacketSetWidgetSlotRsp(req.getMaterialId())); + } + +} + diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketAllWidgetDataNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketAllWidgetDataNotify.java new file mode 100644 index 000000000..c52cc1594 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketAllWidgetDataNotify.java @@ -0,0 +1,59 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.AllWidgetDataNotifyOuterClass.AllWidgetDataNotify; +import emu.grasscutter.net.proto.LunchBoxDataOuterClass; +import emu.grasscutter.net.proto.WidgetSlotDataOuterClass; +import emu.grasscutter.net.proto.WidgetSlotTagOuterClass; + +import java.util.List; +import java.util.Map; + +public class PacketAllWidgetDataNotify extends BasePacket { + + public PacketAllWidgetDataNotify(Player player) { + super(PacketOpcodes.AllWidgetDataNotify); + + // TODO: Implement this + + AllWidgetDataNotify.Builder proto = AllWidgetDataNotify.newBuilder() + // If you want to implement this, feel free to do so. :) + .setLunchBoxData( + LunchBoxDataOuterClass.LunchBoxData.newBuilder().build() + ) + // Maybe it's a little difficult, or it makes you upset :( + .addAllOneoffGatherPointDetectorDataList(List.of()) + // So, goodbye, and hopefully sometime in the future o(* ̄▽ ̄*)ブ + .addAllCoolDownGroupDataList(List.of()) + // I'll see your PR with a title that says (・∀・(・∀・(・∀・*) + .addAllAnchorPointList(List.of()) + // "Complete implementation of widget functionality" b( ̄▽ ̄)d  + .addAllClientCollectorDataList(List.of()) + // Good luck, my boy. + .addAllNormalCoolDownDataList(List.of()); + + if (player.getWidgetId() == null) { + proto.addAllSlotList(List.of()); + } else { + proto.addSlotList( + WidgetSlotDataOuterClass.WidgetSlotData.newBuilder() + .setIsActive(true) + .setMaterialId(player.getWidgetId()) + .build() + ); + + proto.addSlotList( + WidgetSlotDataOuterClass.WidgetSlotData.newBuilder() + .setTag(WidgetSlotTagOuterClass.WidgetSlotTag.WIDGET_SLOT_ATTACH_AVATAR) + .build() + ); + } + + AllWidgetDataNotify protoData = proto.build(); + + this.setData(protoData); + } +} + diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetWidgetSlotRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetWidgetSlotRsp.java new file mode 100644 index 000000000..a4e8a2ea9 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetWidgetSlotRsp.java @@ -0,0 +1,41 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.game.player.Player; +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.GetWidgetSlotRspOuterClass; +import emu.grasscutter.net.proto.WidgetSlotDataOuterClass; +import emu.grasscutter.net.proto.WidgetSlotTagOuterClass; + +import java.util.List; + +public class PacketGetWidgetSlotRsp extends BasePacket { + + public PacketGetWidgetSlotRsp(Player player) { + super(PacketOpcodes.GetWidgetSlotRsp); + + GetWidgetSlotRspOuterClass.GetWidgetSlotRsp.Builder proto = + GetWidgetSlotRspOuterClass.GetWidgetSlotRsp.newBuilder(); + + if (player.getWidgetId() == null) { + proto.addAllSlotList(List.of()); + } else { + proto.addSlotList( + WidgetSlotDataOuterClass.WidgetSlotData.newBuilder() + .setIsActive(true) + .setMaterialId(player.getWidgetId()) + .build() + ); + + proto.addSlotList( + WidgetSlotDataOuterClass.WidgetSlotData.newBuilder() + .setTag(WidgetSlotTagOuterClass.WidgetSlotTag.WIDGET_SLOT_ATTACH_AVATAR) + .build() + ); + } + + GetWidgetSlotRspOuterClass.GetWidgetSlotRsp protoData = proto.build(); + + this.setData(protoData); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketSetWidgetSlotRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketSetWidgetSlotRsp.java new file mode 100644 index 000000000..0f81afa85 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketSetWidgetSlotRsp.java @@ -0,0 +1,18 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.SetWidgetSlotRspOuterClass; + +public class PacketSetWidgetSlotRsp extends BasePacket { + + public PacketSetWidgetSlotRsp(int materialId) { + super(PacketOpcodes.SetWidgetSlotRsp); + + SetWidgetSlotRspOuterClass.SetWidgetSlotRsp proto = SetWidgetSlotRspOuterClass.SetWidgetSlotRsp.newBuilder() + .setMaterialId(materialId) + .build(); + + this.setData(proto); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetAllDataNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetAllDataNotify.java new file mode 100644 index 000000000..b0000efb7 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetGadgetAllDataNotify.java @@ -0,0 +1,16 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.WidgetGadgetAllDataNotifyOuterClass.WidgetGadgetAllDataNotify; + +public class PacketWidgetGadgetAllDataNotify extends BasePacket { + + public PacketWidgetGadgetAllDataNotify() { + super(PacketOpcodes.AllWidgetDataNotify); + + WidgetGadgetAllDataNotify proto = WidgetGadgetAllDataNotify.newBuilder().build(); + + this.setData(proto); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetSlotChangeNotify.java b/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetSlotChangeNotify.java new file mode 100644 index 000000000..ab0ace7eb --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketWidgetSlotChangeNotify.java @@ -0,0 +1,47 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.WidgetSlotChangeNotifyOuterClass; +import emu.grasscutter.net.proto.WidgetSlotDataOuterClass; +import emu.grasscutter.net.proto.WidgetSlotOpOuterClass; + +public class PacketWidgetSlotChangeNotify extends BasePacket { + + public PacketWidgetSlotChangeNotify(WidgetSlotChangeNotifyOuterClass.WidgetSlotChangeNotify proto) { + super(PacketOpcodes.WidgetSlotChangeNotify); + + this.setData(proto); + } + + public PacketWidgetSlotChangeNotify(WidgetSlotOpOuterClass.WidgetSlotOp op) { + super(PacketOpcodes.WidgetSlotChangeNotify); + + WidgetSlotChangeNotifyOuterClass.WidgetSlotChangeNotify proto = WidgetSlotChangeNotifyOuterClass.WidgetSlotChangeNotify.newBuilder() + .setOp(op) + .setSlot( + WidgetSlotDataOuterClass.WidgetSlotData.newBuilder() + .setIsActive(true) + .build() + ) + .build(); + + this.setData(proto); + } + + public PacketWidgetSlotChangeNotify(int materialId) { + super(PacketOpcodes.WidgetSlotChangeNotify); + + WidgetSlotChangeNotifyOuterClass.WidgetSlotChangeNotify proto = WidgetSlotChangeNotifyOuterClass.WidgetSlotChangeNotify.newBuilder() + .setSlot( + WidgetSlotDataOuterClass.WidgetSlotData.newBuilder() + .setIsActive(true) + .setMaterialId(materialId) + .build() + ) + .build(); + + this.setData(proto); + } + +}