perf: allow some avatars create an extra summon unit

This commit is contained in:
Somebody
2025-05-01 13:36:23 +08:00
committed by StopWuyu
parent 49ad2acaaf
commit aeef9cf89f
13 changed files with 36 additions and 17 deletions

View File

@@ -1,5 +1,6 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database.Avatar;
using EggLink.DanhengServer.Database.Inventory;
using EggLink.DanhengServer.GameServer.Game.Player;
using EggLink.DanhengServer.GameServer.Game.RogueMagic;
@@ -197,7 +198,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
InvokeOnPlayerEnterBattle(Player, battleInstance);
await Player.SendPacket(new PacketSceneEnterStageScRsp(battleInstance));
Player.SceneInstance?.ClearSummonUnit();
Player.SceneInstance?.OnEnterStage();
}
public async ValueTask<BattleInstance?> StartCocoonStage(int cocoonId, int wave, int worldLevel)
@@ -326,15 +327,13 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
// Update battle status
foreach (var avatar in req.Stt.BattleAvatarList)
{
var avatarInstance = Player.AvatarManager!.GetFormalAvatar((int)avatar.Id);
BaseAvatarInfo? avatarInstance = Player.AvatarManager!.GetFormalAvatar((int)avatar.Id);
var prop = avatar.AvatarStatus;
var curHp = (int)Math.Max(Math.Round(prop.LeftHp / prop.MaxHp * 10000), minimumHp);
var curSp = (int)prop.LeftSp * 100;
if (avatarInstance == null)
{
GameData.SpecialAvatarData.TryGetValue((int)(avatar.Id * 10 + Player.Data.WorldLevel),
out var specialAvatar);
if (specialAvatar == null) continue;
avatarInstance = Player.AvatarManager!.GetTrialAvatar((int)avatar.Id);
avatarInstance?.SetCurHp(curHp, lineup.LineupType != 0);
avatarInstance?.SetCurSp(curSp, lineup.LineupType != 0);
}

View File

@@ -60,7 +60,8 @@ public class LineupManager : BasePlayerManager
BaseAvatarInfo? avatarInfo = null;
if (avatar.SpecialAvatarId > 0)
{
avatarInfo = Player.AvatarManager!.GetFormalAvatar(avatar.SpecialAvatarId);
avatarInfo = Player.AvatarManager!.GetTrialAvatar(avatar.SpecialAvatarId);
avatarType = AvatarType.AvatarTrialType;
}
else if (avatar.AssistUid > 0)
{
@@ -158,10 +159,13 @@ public class LineupManager : BasePlayerManager
foreach (var avatarId in baseAvatarIds)
{
GameData.SpecialAvatarData.TryGetValue(avatarId * 10 + worldLevel, out var specialAvatar);
if (specialAvatar != null)
var trial = Player.AvatarManager!.GetTrialAvatar(avatarId);
if (trial != null)
{
trial.CheckLevel(worldLevel);
lineup.BaseAvatars!.Add(new LineupAvatarInfo
{ BaseAvatarId = specialAvatar.AvatarID, SpecialAvatarId = specialAvatar.SpecialAvatarID });
{ BaseAvatarId = trial.BaseAvatarId, SpecialAvatarId = trial.SpecialAvatarId });
}
else
lineup.BaseAvatars!.Add(new LineupAvatarInfo { BaseAvatarId = avatarId });
}

View File

@@ -29,7 +29,6 @@ public class EntityMonster(
public List<SceneBuff> BuffList { get; set; } = [];
public SceneBuff? TempBuff { get; set; }
public bool IsAlive { get; private set; } = true;
public bool IsInSummonUnit { get; set; } = false;
public int EventID { get; set; } = info.EventID;
public int CustomStageID { get; set; } = 0;

View File

@@ -19,6 +19,7 @@ public class EntitySummonUnit : IGameEntity
public int EntityId { get; set; }
public int GroupID { get; set; } = 0;
public List<SceneBuff> BuffList { get; set; } = [];
public HashSet<int> CaughtEntityIds { get; set; } = [];
public async ValueTask AddBuff(SceneBuff buff)
{

View File

@@ -287,6 +287,8 @@ public class AbilityLevelTask(PlayerInstance player)
if (!GameData.SummonUnitDataData.TryGetValue(createSummonUnit.SummonUnitID, out var excel))
return new AbilityLevelResult();
if (excel.IsClient) return new AbilityLevelResult();
var unit = new EntitySummonUnit
{
EntityId = 0,
@@ -307,7 +309,7 @@ public class AbilityLevelTask(PlayerInstance player)
public async ValueTask<AbilityLevelResult> DestroySummonUnit(AbilityLevelParam param)
{
if (param.Act is CreateSummonUnit createSummonUnit) await Player.SceneInstance!.ClearSummonUnit(); // TODO
if (param.Act is DestroySummonUnit destroySummonUnit) await Player.SceneInstance!.RemoveSummonUnitById(destroySummonUnit.SummonUnitID); // TODO
return new AbilityLevelResult();
}

View File

@@ -13,7 +13,7 @@ public class HandlerQuickStartCocoonStageCsReq : Handler
var battle =
await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave,
(int)req.WorldLevel);
connection.Player.SceneInstance?.ClearSummonUnit();
connection.Player.SceneInstance?.OnEnterStage();
if (battle != null)
await connection.SendPacket(new PacketQuickStartCocoonStageScRsp(battle, (int)req.CocoonId, (int)req.Wave));

View File

@@ -12,7 +12,7 @@ public class HandlerRefreshTriggerByClientCsReq : Handler
var req = RefreshTriggerByClientCsReq.Parser.ParseFrom(data);
var player = connection.Player!;
var ret = await player.SceneInstance!.TriggerSummonUnit(req.TriggerName, req.TriggerTargetIdList.ToList());
var ret = await player.SceneInstance!.TriggerSummonUnit((int)req.TriggerEntityId, req.TriggerName, req.TriggerTargetIdList.ToList());
await connection.SendPacket(new PacketRefreshTriggerByClientScRsp(ret, req.TriggerName, req.TriggerEntityId));
}

View File

@@ -16,6 +16,6 @@ public class HandlerSceneCastSkillCsReq : Handler
await connection.SendPacket(new PacketSceneCastSkillScRsp(res.RetCode, req.CastEntityId, res.Instance,
res.TriggerBattleInfos ?? []));
if (res.Instance != null) await player.SceneInstance!.ClearSummonUnit();
if (res.Instance != null) await player.SceneInstance!.OnEnterStage();
}
}

View File

@@ -13,7 +13,7 @@ public class HandlerStartCocoonStageCsReq : Handler
var battle =
await connection.Player!.BattleManager!.StartCocoonStage((int)req.CocoonId, (int)req.Wave,
(int)req.WorldLevel);
connection.Player.SceneInstance?.ClearSummonUnit();
connection.Player.SceneInstance?.OnEnterStage();
if (battle != null)
await connection.SendPacket(new PacketStartCocoonStageScRsp(battle, (int)req.CocoonId, (int)req.Wave));