diff --git a/Common/Data/Config/MissionInfo.cs b/Common/Data/Config/MissionInfo.cs index ac42a20c..876f9b6a 100644 --- a/Common/Data/Config/MissionInfo.cs +++ b/Common/Data/Config/MissionInfo.cs @@ -20,6 +20,9 @@ namespace EggLink.DanhengServer.Data.Config public int ID { get; set; } public int MainMissionID { get; set; } public string MissionJsonPath { get; set; } = ""; + + [JsonConverter(typeof(StringEnumConverter))] + public SubMissionTakeTypeEnum TakeType { get; set; } public List TakeParamIntList { get; set; } = []; // the mission's prerequisites [JsonConverter(typeof(StringEnumConverter))] public MissionFinishTypeEnum FinishType { get; set; } diff --git a/Common/Enums/Mission/MissionTakeTypeEnum.cs b/Common/Enums/Mission/MissionTakeTypeEnum.cs index 5dd38663..4c0910dc 100644 --- a/Common/Enums/Mission/MissionTakeTypeEnum.cs +++ b/Common/Enums/Mission/MissionTakeTypeEnum.cs @@ -11,4 +11,11 @@ MuseumPhaseRenewPointReach = 6, HeliobusPhaseReach = 7, } + public enum SubMissionTakeTypeEnum + { + AnySequence = 0, + Auto = 1, + CustomValue = 2, + MultiSequence = 3, + } } diff --git a/GameServer/Command/Cmd/CommandMission.cs b/GameServer/Command/Cmd/CommandMission.cs index 5a79dce9..657d3c22 100644 --- a/GameServer/Command/Cmd/CommandMission.cs +++ b/GameServer/Command/Cmd/CommandMission.cs @@ -64,7 +64,7 @@ namespace EggLink.DanhengServer.Command.Cmd } arg.SendMsg("Running missions:"); - Dictionary> map = []; + SortedDictionary> map = []; foreach (var m in runningMissions) { @@ -80,8 +80,13 @@ namespace EggLink.DanhengServer.Command.Cmd var possibleStuckIds = new List(); var morePossibleStuckIds = new List(); + var count = 0; foreach (var list in map) { + if (count >= 6) + { + break; + } arg.SendMsg($"Main mission {list.Key}:"); var sb = new StringBuilder(); foreach (var id in list.Value) @@ -103,6 +108,8 @@ namespace EggLink.DanhengServer.Command.Cmd sb.Remove(sb.Length - 2, 2); arg.SendMsg(sb.ToString()); + + count++; } if (morePossibleStuckIds.Count > 0) diff --git a/GameServer/Game/Mission/MissionManager.cs b/GameServer/Game/Mission/MissionManager.cs index 805788df..8a9001b7 100644 --- a/GameServer/Game/Mission/MissionManager.cs +++ b/GameServer/Game/Mission/MissionManager.cs @@ -6,6 +6,7 @@ using EggLink.DanhengServer.Enums; using EggLink.DanhengServer.Game.Mission.FinishAction; using EggLink.DanhengServer.Game.Mission.FinishType; using EggLink.DanhengServer.Game.Player; +using EggLink.DanhengServer.Server.Packet.Send.Avatar; using EggLink.DanhengServer.Server.Packet.Send.Mission; using EggLink.DanhengServer.Server.Packet.Send.Player; using EggLink.DanhengServer.Server.Packet.Send.Scene; @@ -22,6 +23,8 @@ namespace EggLink.DanhengServer.Game.Mission public Dictionary ActionHandlers = []; public Dictionary FinishTypeHandlers = []; + public readonly List SkipSubMissionList = [101030104]; // bug + public MissionManager(PlayerInstance player) : base(player) { Data = DatabaseHelper.Instance!.GetInstanceOrCreateNew(player.Uid); @@ -80,7 +83,7 @@ namespace EggLink.DanhengServer.Game.Mission public List ReAcceptMainMission(int missionId, bool sendPacket = true) { if (!ConfigManager.Config.ServerOption.EnableMission) return []; - if (!Data.MissionInfo.TryGetValue(missionId, out _)) return []; + //if (!Data.MissionInfo.TryGetValue(missionId, out _)) return []; Data.MissionInfo.Remove(missionId); Data.MainMissionInfo.Remove(missionId); @@ -128,6 +131,12 @@ namespace EggLink.DanhengServer.Game.Mission if (doFinishTypeAction) handler?.HandleFinishType(Player, mission.SubMissionInfo, null); } + + if (SkipSubMissionList.Contains(missionId)) + { + FinishSubMission(missionId); + } + return sync; } @@ -185,12 +194,12 @@ namespace EggLink.DanhengServer.Game.Mission GameData.RaidConfigData.TryGetValue(Player.CurRaidId, out var raidConfig); if (raidConfig != null) { - bool leave = true; + bool leave = false; foreach (var id in raidConfig.MainMissionIDList) { - if (GetMainMissionStatus(id) != MissionPhaseEnum.Finish) + if (GetMainMissionStatus(id) == MissionPhaseEnum.Finish) { - leave = false; + leave = true; } } if (leave) @@ -284,6 +293,7 @@ namespace EggLink.DanhengServer.Game.Mission Player.AvatarManager!.GetHero()!.HeroId += 2; DatabaseHelper.Instance?.UpdateInstance(Player.AvatarManager!.AvatarData); Player.SendPacket(new PacketPlayerSyncScNotify(Player.AvatarManager!.GetHero()!)); + Player.SendPacket(new PacketHeroBasicTypeChangedNotify(Player.AvatarManager!.GetHero()!.HeroId)); } } @@ -354,6 +364,27 @@ namespace EggLink.DanhengServer.Game.Mission } } + public void HandleCustomValue(int index, int cValue, int missionId) + { + if (!ConfigManager.Config.ServerOption.EnableMission) return; + + GameData.SubMissionData.TryGetValue(missionId, out var subMission); + if (subMission == null) return; + var mainMissionId = subMission.MainMissionID; + GameData.MainMissionData.TryGetValue(mainMissionId, out var mainMission); + + foreach (var mission in mainMission?.MissionInfo?.SubMissionList ?? []) + { + if (mission.TakeType == SubMissionTakeTypeEnum.CustomValue) + { + if (mission.TakeParamIntList[index] == cValue) + { + AcceptSubMission(mission.ID); + } + } + } + } + #endregion #region Mission Status @@ -380,9 +411,15 @@ namespace EggLink.DanhengServer.Game.Mission { if (info.TryGetValue(missionId, out var mission)) { + if (SkipSubMissionList.Contains(missionId)) + { + FinishSubMission(missionId); + mission.Status = MissionPhaseEnum.Finish; + } return mission.Status; } } + return MissionPhaseEnum.None; } diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index 581ab171..2dad3d57 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -213,7 +213,10 @@ namespace EggLink.DanhengServer.Game.Player public void SendPacket(BasePacket packet) { - Connection?.SendPacket(packet); + if (Connection?.IsOnline == true) + { + Connection?.SendPacket(packet); + } } #endregion @@ -596,12 +599,15 @@ namespace EggLink.DanhengServer.Game.Player else { EnterScene(OldEntryId, 0, true); + MoveTo(LastPos!, LastRot!); } SendPacket(new PacketRaidInfoNotify((uint)CurRaidId, RaidStatus.Finish)); CurRaidId = 0; OldEntryId = 0; + LastPos = null; + LastRot = null; } #endregion diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerGetChatFriendHistoryCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerGetChatFriendHistoryCsReq.cs new file mode 100644 index 00000000..8bc7b8e3 --- /dev/null +++ b/GameServer/Server/Packet/Recv/Friend/HandlerGetChatFriendHistoryCsReq.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Server.Packet.Recv.Friend +{ + [Opcode(CmdIds.GetChatFriendHistoryCsReq)] + public class HandlerGetChatFriendHistoryCsReq : Handler + { + public override void OnHandle(Connection connection, byte[] header, byte[] data) + { + connection.SendPacket(CmdIds.GetChatFriendHistoryScRsp); + } + } +} diff --git a/GameServer/Server/Packet/Recv/Friend/HandlerSendMsgCsReq.cs b/GameServer/Server/Packet/Recv/Friend/HandlerSendMsgCsReq.cs index 59e764a4..afd1a236 100644 --- a/GameServer/Server/Packet/Recv/Friend/HandlerSendMsgCsReq.cs +++ b/GameServer/Server/Packet/Recv/Friend/HandlerSendMsgCsReq.cs @@ -19,6 +19,8 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Friend { var req = SendMsgCsReq.Parser.ParseFrom(data); + connection.SendPacket(CmdIds.SendMsgScRsp); + if (req.MessageType == MsgType.CustomText) { connection.Player!.FriendManager!.SendMessage(connection.Player!.Uid, (int)req.TargetList[0], req.MessageText); @@ -27,8 +29,6 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Friend { connection.Player!.FriendManager!.SendMessage(connection.Player!.Uid, (int)req.TargetList[0], null, (int)req.ExtraId); } - - connection.SendPacket(CmdIds.SendMsgScRsp); } } } diff --git a/GameServer/Server/Packet/Recv/Mission/HandlerFinishTalkMissionCsReq.cs b/GameServer/Server/Packet/Recv/Mission/HandlerFinishTalkMissionCsReq.cs index 86862402..03ff371c 100644 --- a/GameServer/Server/Packet/Recv/Mission/HandlerFinishTalkMissionCsReq.cs +++ b/GameServer/Server/Packet/Recv/Mission/HandlerFinishTalkMissionCsReq.cs @@ -1,5 +1,6 @@ using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Server.Packet.Send.Mission; +using Microsoft.EntityFrameworkCore; namespace EggLink.DanhengServer.Server.Packet.Recv.Mission { @@ -18,6 +19,11 @@ namespace EggLink.DanhengServer.Server.Packet.Recv.Mission { } + if (req.CustomValueList != null && req.CustomValueList.Count > 0) + { + player.MissionManager!.HandleCustomValue((int)(req.CustomValueList[0].Index + 1), (int)req.CustomValueList[0].MBFHEFKNIHB, (int)req.SubMissionId); + } + connection.SendPacket(new PacketFinishTalkMissionScRsp(req.TalkStr)); } } diff --git a/GameServer/Server/Packet/Send/Avatar/PacketHeroBasicTypeChangedNotify.cs b/GameServer/Server/Packet/Send/Avatar/PacketHeroBasicTypeChangedNotify.cs new file mode 100644 index 00000000..0763d441 --- /dev/null +++ b/GameServer/Server/Packet/Send/Avatar/PacketHeroBasicTypeChangedNotify.cs @@ -0,0 +1,22 @@ +using EggLink.DanhengServer.Proto; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace EggLink.DanhengServer.Server.Packet.Send.Avatar +{ + public class PacketHeroBasicTypeChangedNotify : BasePacket + { + public PacketHeroBasicTypeChangedNotify(int type) : base(CmdIds.HeroBasicTypeChangedNotify) + { + var proto = new HeroBasicTypeChangedNotify() + { + CurBasicType = (HeroBasicType)type + }; + + SetData(proto); + } + } +}