feat: add Abyss

This commit is contained in:
Naruse
2025-06-17 17:26:38 +08:00
parent 981f2479d9
commit e92798b624
16 changed files with 271 additions and 72 deletions

View File

@@ -42,4 +42,8 @@ public static class GameData
public static Dictionary<int, TutorialDataExcel> TutorialData { get; private set; } = [];
public static Dictionary<int, CityEventPhotoExcel> CityEventPhotoData { get; private set; } = [];
public static Dictionary<int, RandomPlotDataExcel> RandomPlotData { get; private set; } = [];
public static Dictionary<int, UltraEndlessSiteExcel> UltraEndlessSiteData { get; private set; } = [];
public static Dictionary<int, List<UltraEndlessFloorExcel>> UltraEndlessFloorData { get; private set; } = [];
public static Dictionary<int, ExBossMonsterDataExcel> ExBossMonsterData { get; private set; } = [];
}

View File

@@ -1,4 +1,4 @@
using System.Drawing;
using KianaBH.Data;
using KianaBH.Proto;
using KianaBH.Util;
using KianaBH.Util.Extensions;
@@ -23,6 +23,8 @@ public class PlayerData : BaseDatabaseDataHelper
public int BirthDay { get; set; } = 0;
[SugarColumn(IsJson = true)] public WarshipAvatarData WarshipAvatar { get; set; } = new();
[SugarColumn(IsNullable = true)] public long LastActiveTime { get; set; }
[SugarColumn(IsJson = true)] public UltraEndless Abyss { get; set; } = new();
public List<int> ExBossMonster { get; set; } = new List<int> { 51016, 4021, 36112 };
public long RegisterTime { get; set; } = Extensions.GetUnixSec();
public static PlayerData? GetPlayerByUid(long uid)
@@ -64,6 +66,49 @@ public class PlayerData : BaseDatabaseDataHelper
TotalLoginDays = 1
};
}
public uint GetCupNum()
{
uint GroupLevel = (uint)Abyss.GroupLevel;
if (GroupLevel > 6) return (GroupLevel - 6) * 367 + 900;
else if (GroupLevel > 1) return (GroupLevel - 2) * 200 + 100;
else return 0;
}
public List<UltraEndlessSite> ToUltraEndlessSiteProto()
{
int currentSiteId = Abyss.SiteId;
var currentSiteData = GameData.UltraEndlessSiteData.Values
.FirstOrDefault(x => x.SiteID == currentSiteId);
if (currentSiteData == null) return [];
if (currentSiteData.SiteNodeName.StartsWith("Area") &&
int.TryParse(currentSiteData.SiteNodeName.Substring(4), out int areaNumber) &&
areaNumber > 1) currentSiteId -= (areaNumber - 1);
var siteIds = Enumerable.Range(0, 4).Select(i => currentSiteId + i).ToHashSet();
var siteDatas = GameData.UltraEndlessSiteData.Values
.Where(site => siteIds.Contains(site.SiteID));
return siteDatas.Select(site => new UltraEndlessSite
{
SiteId = (uint)site.SiteID,
FloorList =
{
GameData.UltraEndlessFloorData.Values
.SelectMany(floorList => floorList)
.Where(floor => floor.StageID == site.StageID)
.Select(floor => new UltraEndlessFloor
{
Floor = (uint)floor.FloorID,
MaxScore = site.SiteNodeName == "Area3" ? 0 : (uint)floor.MaxScore
})
}
}).ToList();
}
}
public class WarshipAvatarData
@@ -71,3 +116,11 @@ public class WarshipAvatarData
public int FirstAvatarId { get; set; } = 101;
public int SecondAvatarId { get; set; } = 0;
}
public class UltraEndless
{
public int SiteId { get; set; } = 6691;
public int GroupLevel { get; set; } = 8;
public int DynamicHard { get; set; } = 100;
}

View File

@@ -44,6 +44,9 @@ public class WordTextEN
public string Activity => "Activity";
public string Elf => "Elf";
public string Dress => "Outfit";
public string Bracket => "Bracket";
public string Disturbance => "Disturbance";
public string Site => "Site";
// server info
public string Config => "Config File";
@@ -80,7 +83,9 @@ public class CommandTextEN
public HelpTextEN Help { get; } = new();
public ValkTextEN Valk { get; } = new();
public GiveAllTextEN GiveAll { get; } = new();
public ElfTextEN Elf { get; } = new();
public ElfTextEN Elf { get; } = new();
public AbyssTextEN Abyss { get; } = new();
public EndlessTextEN Endless { get; } = new();
}
#endregion
@@ -236,6 +241,37 @@ public class ElfTextEN
public string ElfSetStar => "Set Elf {0}'s Resonance to {1}!";
}
/// <summary>
/// path: Game.Command.Abyss
/// </summary>
public class AbyssTextEN
{
public string Desc => "Set abyss disturbance,bracket,site \n";
public string Usage =>
"Usage: /abyss bracket [1-9]\n\n" +
"Usage: /abyss temp [value]\n\n" +
"Usage: /abyss site [siteId]\n";
public string Success => "Success set {0}";
public string AreaNotFound => "SiteId Not Found";
}
/// <summary>
/// path: Game.Command.Endless
/// </summary>
public class EndlessTextEN
{
public string Desc => "Set Memorial Arena boss \n";
public string Usage =>
"Usage: /endless [bossid1] [bossid2] [bossid3]\n\n" +
"/endless 1001 1002 1003";
public string Success => "Success set Memorial Arena Boss";
public string NotFound => "BossId Not Found";
}
#endregion
#endregion

View File

@@ -0,0 +1,33 @@
using KianaBH.Data;
using KianaBH.Enums.Player;
using KianaBH.Internationalization;
namespace KianaBH.GameServer.Command.Commands;
[CommandInfo("endless", "Game.Command.Endless.Desc", "Game.Command.Endless.Usage", ["en"], [PermEnum.Admin, PermEnum.Support])]
public class CommandEndless : ICommands
{
[CommandDefault]
public async ValueTask SetBoss(CommandArg arg)
{
if (!await arg.CheckOnlineTarget()) return;
var bossIds = new[] { arg.GetInt(0), arg.GetInt(1), arg.GetInt(2) }.ToHashSet();
var data = GameData.ExBossMonsterData.Values
.Where(x => bossIds.Contains(x.BossId))
.Select(x => x.BossId)
.ToList();
if (data.Count == 0)
{
await arg.SendMsg(I18NManager.Translate("Game.Command.Endless.NotFound"));
return;
}
arg.Target!.Player!.Data.ExBossMonster.Clear();
arg.Target!.Player!.Data.ExBossMonster.AddRange(data);
await arg.SendMsg(I18NManager.Translate("Game.Command.Endless.Success"));
}
}

View File

@@ -1,13 +1,14 @@
using KianaBH.GameServer.Server.Packet.Send.Test;
using KianaBH.GameServer.Server.Packet.Send.Endless;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Recv.Test;
namespace KianaBH.GameServer.Server.Packet.Recv.Endless;
[Opcode(CmdIds.UltraEndlessEnterSiteReq)]
public class HandlerUltraEndlessEnterSiteReq : Handler
{
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
await connection.SendPacket(new PacketUltraEndlessEnterSiteRsp());
var req = UltraEndlessEnterSiteReq.Parser.ParseFrom(data);
await connection.SendPacket(new PacketUltraEndlessEnterSiteRsp(req.SiteId));
}
}

View File

@@ -1,13 +1,13 @@
using KianaBH.GameServer.Server.Packet.Send.Test;
using KianaBH.GameServer.Server.Packet.Send.Endless;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Recv.Test;
namespace KianaBH.GameServer.Server.Packet.Recv.Endless;
[Opcode(CmdIds.UltraEndlessGetMainDataReq)]
public class HandlerUltraEndlessGetMainDataReq : Handler
{
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
await connection.SendPacket(new PacketUltraEndlessGetMainDataRsp());
await connection.SendPacket(new PacketUltraEndlessGetMainDataRsp(connection.Player!));
}
}

View File

@@ -1,13 +1,14 @@
using KianaBH.GameServer.Server.Packet.Send.Test;
using KianaBH.GameServer.Server.Packet.Send.Endless;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Recv.Test;
namespace KianaBH.GameServer.Server.Packet.Recv.Endless;
[Opcode(CmdIds.UltraEndlessGetTopRankReq)]
public class HandlerUltraEndlessGetTopRankReq : Handler
{
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
await connection.SendPacket(new PacketUltraEndlessGetTopRankRsp());
var req = UltraEndlessGetTopRankReq.Parser.ParseFrom(data);
await connection.SendPacket(new PacketUltraEndlessGetTopRankRsp(connection.Player!,req.ScheduleId));
}
}

View File

@@ -1,13 +1,14 @@
using KianaBH.GameServer.Server.Packet.Send.Test;
using KianaBH.GameServer.Server.Packet.Send.Endless;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Recv.Test;
namespace KianaBH.GameServer.Server.Packet.Recv.Endless;
[Opcode(CmdIds.UltraEndlessReportSiteFloorReq)]
public class HandlerUltraEndlessReportSiteFloorReq : Handler
{
public override async Task OnHandle(Connection connection, byte[] header, byte[] data)
{
await connection.SendPacket(new PacketUltraEndlessReportSiteFloorRsp());
var req = UltraEndlessReportSiteFloorReq.Parser.ParseFrom(data);
await connection.SendPacket(new PacketUltraEndlessReportSiteFloorRsp(req.SiteId,req.Floor));
}
}

View File

@@ -1,15 +1,15 @@
using KianaBH.KcpSharp;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Send.Test;
namespace KianaBH.GameServer.Server.Packet.Send.Endless;
public class PacketUltraEndlessEnterSiteRsp : BasePacket
{
public PacketUltraEndlessEnterSiteRsp() : base(CmdIds.UltraEndlessEnterSiteRsp)
public PacketUltraEndlessEnterSiteRsp(uint siteId) : base(CmdIds.UltraEndlessEnterSiteRsp)
{
var proto = new UltraEndlessEnterSiteRsp
{
SiteId = siteId
};
SetData(proto);

View File

@@ -0,0 +1,66 @@
using KianaBH.Data;
using KianaBH.GameServer.Game.Player;
using KianaBH.KcpSharp;
using KianaBH.Proto;
using KianaBH.Util.Extensions;
namespace KianaBH.GameServer.Server.Packet.Send.Endless;
public class PacketUltraEndlessGetMainDataRsp : BasePacket
{
public PacketUltraEndlessGetMainDataRsp(PlayerInstance player) : base(CmdIds.UltraEndlessGetMainDataRsp)
{
uint cupNum = player.Data.GetCupNum();
var proto = new UltraEndlessGetMainDataRsp
{
ScheduleId = 1028,
GroupLevel = (uint)player.Data.Abyss.GroupLevel,
TopGroupLevel = 9,
CupNum = cupNum,
MainData = new UltraEndlessMainData
{
ScheduleId = 1028,
BeginTime = (uint)Extensions.GetUnixSec(),
EndTime = (uint)Extensions.GetUnixSec() + 3600 * 24 * 7,
CloseTime = (uint)Extensions.GetUnixSec() + 3600 * 24 * 7 + 1200,
CurSeasonId = 1,
SiteList = { player.Data.ToUltraEndlessSiteProto() }
},
DynamicHardLevel = (uint)player.Data.Abyss.DynamicHard,
EndlessPlayerList =
{
new UltraEndlessPlayer
{
Uid = (uint)player.Data.Uid,
GroupLevel = (uint)player.Data.Abyss.GroupLevel,
CupNum = cupNum,
MaxStageScore = 18000
}
},
BriefDataList =
{
new PlayerFriendBriefData
{
Uid = (uint)player.Data.Uid,
Nickname = player.Data.Name,
Level = (uint)player.Data.Level,
}
},
LastSettleInfo = new UltraEndlessSettleInfo
{
CupNum = 280,
CupNumAfterScheduleSettle = 280,
CupNumAfterSeasonSettle = 380,
CupNumBefore = 380,
CupNumBeforeSeasonSettle = 380,
GroupLevel = 3,
GroupMemberNum = 20,
MmrScore = 974,
Rank = 20,
ScheduleId = 3426
},
};
SetData(proto);
}
}

View File

@@ -0,0 +1,37 @@
using KianaBH.GameServer.Game.Player;
using KianaBH.KcpSharp;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Send.Endless;
public class PacketUltraEndlessGetTopRankRsp : BasePacket
{
public PacketUltraEndlessGetTopRankRsp(PlayerInstance player, uint scheduleId) : base(CmdIds.UltraEndlessGetTopRankRsp)
{
var proto = new UltraEndlessGetTopRankRsp
{
ScheduleId = scheduleId,
RankData = new RankShowData
{
IsFeatureClosed = true,
MyRank = 1,
MyRankType = 1,
MyScore = 18000,
RankList =
{
new UserRankData
{
Uid = (uint)player.Data.Uid,
NickName = player.Data.Name,
Rank = 1,
Score = 18000,
CustomHeadId = (uint)player.Data.HeadIcon,
FrameId = (uint)player.Data.HeadFrame,
}
}
},
};
SetData(proto);
}
}

View File

@@ -0,0 +1,18 @@
using KianaBH.KcpSharp;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Send.Endless;
public class PacketUltraEndlessReportSiteFloorRsp : BasePacket
{
public PacketUltraEndlessReportSiteFloorRsp(uint siteId, uint floor) : base(CmdIds.UltraEndlessReportSiteFloorRsp)
{
var proto = new UltraEndlessReportSiteFloorRsp
{
SiteId = siteId,
Floor = floor,
};
SetData(proto);
}
}

View File

@@ -1,17 +0,0 @@
using KianaBH.KcpSharp;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Send.Test;
public class PacketUltraEndlessGetMainDataRsp : BasePacket
{
public PacketUltraEndlessGetMainDataRsp() : base(CmdIds.UltraEndlessGetMainDataRsp)
{
var proto = new UltraEndlessGetMainDataRsp
{
};
SetData(proto);
}
}

View File

@@ -1,17 +0,0 @@
using KianaBH.KcpSharp;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Send.Test;
public class PacketUltraEndlessGetTopRankRsp : BasePacket
{
public PacketUltraEndlessGetTopRankRsp() : base(CmdIds.UltraEndlessGetTopRankRsp)
{
var proto = new UltraEndlessGetTopRankRsp
{
};
SetData(proto);
}
}

View File

@@ -1,17 +0,0 @@
using KianaBH.KcpSharp;
using KianaBH.Proto;
namespace KianaBH.GameServer.Server.Packet.Send.Test;
public class PacketUltraEndlessReportSiteFloorRsp : BasePacket
{
public PacketUltraEndlessReportSiteFloorRsp() : base(CmdIds.UltraEndlessReportSiteFloorRsp)
{
var proto = new UltraEndlessReportSiteFloorRsp
{
};
SetData(proto);
}
}

View File

@@ -561,7 +561,7 @@ message PlayerDetailData {
uint32 frame_id = 16;
PlayerAdventureData adventure = 17;
repeated AvatarDetailData backup_avatar_list = 18;
Medal on_medal = 19;
uint32 on_medal = 19;
bool is_allow_visit = 30;
uint32 visit_avatar = 31;
uint32 be_liked_num = 32;
@@ -596,7 +596,7 @@ message PlayerFriendBriefData {
string armada_name = 13;
uint32 bond = 14;
uint32 on_medal_id = 15;
Medal on_medal = 16;
uint32 on_medal = 16;
uint32 frame_id = 17;
uint32 mp_level = 18;
uint32 custom_head_id = 19;
@@ -17223,7 +17223,7 @@ message ChatworldPlayerInfo {
repeated ChatworldBuff buff_list = 18;
uint32 runtime_tag = 20;
uint32 custom_head_id = 22;
Medal on_medal = 23;
uint32 on_medal = 23;
ChatworldBattle battle_info = 32;
}
@@ -28646,7 +28646,7 @@ message GetMainDataRsp {
uint32 register_time = 40;
WarshipThemeData warship_theme = 41;
repeated WaitDelMaterialData wait_del_material_list = 42;
Medal on_medal = 43;
uint32 on_medal = 43;
repeated uint32 type_list = 44;
}