diff --git a/proto/DailyDungeonEntryInfo.proto b/proto/DailyDungeonEntryInfo.proto new file mode 100644 index 000000000..d12b175e7 --- /dev/null +++ b/proto/DailyDungeonEntryInfo.proto @@ -0,0 +1,12 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "DungeonEntryInfo.proto"; + +message DailyDungeonEntryInfo { + uint32 dungeon_entry_id = 1; + uint32 dungeon_entry_config_id = 2; + uint32 recommend_dungeon_id = 3; + DungeonEntryInfo recommend_dungeon_entry_info = 4; +} diff --git a/proto/GetDailyDungeonEntryInfoReq.proto b/proto/GetDailyDungeonEntryInfoReq.proto new file mode 100644 index 000000000..8b01cfd16 --- /dev/null +++ b/proto/GetDailyDungeonEntryInfoReq.proto @@ -0,0 +1,11 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +// CmdId: 929 +// EnetChannelId: 0 +// EnetIsReliable: true +// IsAllowClient: true +message GetDailyDungeonEntryInfoReq { + uint32 scene_id = 11; +} diff --git a/proto/GetDailyDungeonEntryInfoRsp.proto b/proto/GetDailyDungeonEntryInfoRsp.proto new file mode 100644 index 000000000..17c1b9ecc --- /dev/null +++ b/proto/GetDailyDungeonEntryInfoRsp.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +option java_package = "emu.grasscutter.net.proto"; + +import "DailyDungeonEntryInfo.proto"; + +// CmdId: 925 +// EnetChannelId: 0 +// EnetIsReliable: true +message GetDailyDungeonEntryInfoRsp { + int32 retcode = 9; + repeated DailyDungeonEntryInfo daily_dungeon_info_list = 4; +} diff --git a/src/main/java/emu/grasscutter/data/GameData.java b/src/main/java/emu/grasscutter/data/GameData.java index 67c7e2945..ffbda065a 100644 --- a/src/main/java/emu/grasscutter/data/GameData.java +++ b/src/main/java/emu/grasscutter/data/GameData.java @@ -78,6 +78,8 @@ public class GameData { private static final Int2ObjectMap worldAreaDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap worldLevelDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap dailyDungeonDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap dungeonEntryDataMap = new Int2ObjectOpenHashMap<>(); + private static final Int2ObjectMap dungeonDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap questDataMap = new Int2ObjectOpenHashMap<>(); private static final Int2ObjectMap shopGoodsDataMap = new Int2ObjectOpenHashMap<>(); @@ -346,6 +348,10 @@ public class GameData { return dailyDungeonDataMap; } + public static Int2ObjectMap getDungeonEntryDatatMap(){ + return dungeonEntryDataMap; + } + public static Map> getShopGoodsDataEntries() { if (shopGoods.isEmpty()) { shopGoodsDataMap.forEach((k, v) -> { diff --git a/src/main/java/emu/grasscutter/data/excels/DungeonEntryData.java b/src/main/java/emu/grasscutter/data/excels/DungeonEntryData.java new file mode 100644 index 000000000..a73bf5638 --- /dev/null +++ b/src/main/java/emu/grasscutter/data/excels/DungeonEntryData.java @@ -0,0 +1,25 @@ +package emu.grasscutter.data.excels; + +import emu.grasscutter.data.GameResource; +import emu.grasscutter.data.ResourceType; +import lombok.Getter; +import lombok.Setter; + +@ResourceType(name = "DungeonEntryExcelConfigData.json") +@Getter +@Setter +public class DungeonEntryData extends GameResource { + private int dungeonEntryId; + private int sceneId; + private int id; + + @Override + public int getId() { + return this.id; + } + + @Override + public void onLoad() { + + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetDailyDungeonEntryInfoReq.java b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetDailyDungeonEntryInfoReq.java new file mode 100644 index 000000000..f81e9bb6b --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/recv/HandlerGetDailyDungeonEntryInfoReq.java @@ -0,0 +1,21 @@ +package emu.grasscutter.server.packet.recv; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.net.packet.Opcodes; +import emu.grasscutter.net.packet.PacketHandler; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.GetDailyDungeonEntryInfoReqOuterClass; +import emu.grasscutter.server.game.GameSession; +import emu.grasscutter.server.packet.send.PacketGetDailyDungeonEntryInfoRsp; + +@Opcodes(PacketOpcodes.GetDailyDungeonEntryInfoReq) +public class HandlerGetDailyDungeonEntryInfoReq extends PacketHandler { + + @Override + public void handle(GameSession session, byte[] header, byte[] payload) throws Exception { + var req= + GetDailyDungeonEntryInfoReqOuterClass.GetDailyDungeonEntryInfoReq.parseFrom(payload); + + session.send(new PacketGetDailyDungeonEntryInfoRsp(req.getSceneId())); + } +} diff --git a/src/main/java/emu/grasscutter/server/packet/send/PacketGetDailyDungeonEntryInfoRsp.java b/src/main/java/emu/grasscutter/server/packet/send/PacketGetDailyDungeonEntryInfoRsp.java new file mode 100644 index 000000000..55f3bcc13 --- /dev/null +++ b/src/main/java/emu/grasscutter/server/packet/send/PacketGetDailyDungeonEntryInfoRsp.java @@ -0,0 +1,43 @@ +package emu.grasscutter.server.packet.send; + +import emu.grasscutter.Grasscutter; +import emu.grasscutter.data.GameData; +import emu.grasscutter.data.excels.DungeonEntryData; +import emu.grasscutter.net.packet.BasePacket; +import emu.grasscutter.net.packet.PacketOpcodes; +import emu.grasscutter.net.proto.DailyDungeonEntryInfoOuterClass; +import emu.grasscutter.net.proto.DungeonEntryInfoOuterClass; +import emu.grasscutter.net.proto.GetDailyDungeonEntryInfoRspOuterClass; + +import java.util.List; + +public class PacketGetDailyDungeonEntryInfoRsp extends BasePacket { + + public PacketGetDailyDungeonEntryInfoRsp(Integer sceneID) { + super(PacketOpcodes.GetDailyDungeonEntryInfoRsp); + + var resp= GetDailyDungeonEntryInfoRspOuterClass.GetDailyDungeonEntryInfoRsp.newBuilder(); + + for (var info : GameData.getDungeonEntryDatatMap().values().parallelStream().filter(d -> d.getSceneId() == sceneID).map(this::getDungonEntryInfo).toList()) + resp.addDailyDungeonInfoList(info); + + this.setData(resp.build()); + } + + private DailyDungeonEntryInfoOuterClass.DailyDungeonEntryInfo getDungonEntryInfo(DungeonEntryData data) { + var dungeonEntryId = data.getDungeonEntryId(); + var id = data.getId(); + + //TODO: 来个爹把这块整活了吧 咚咚咚 + DungeonEntryInfoOuterClass.DungeonEntryInfo dungeonEntryInfo + = DungeonEntryInfoOuterClass.DungeonEntryInfo.newBuilder().setDungeonId(130).build(); + + var builder = DailyDungeonEntryInfoOuterClass.DailyDungeonEntryInfo.newBuilder(); + + builder.setDungeonEntryId(dungeonEntryId); + builder.setDungeonEntryConfigId(id); + builder.setRecommendDungeonEntryInfo(dungeonEntryInfo); + return builder.build(); + } + +}