Fix some of technique bugs

This commit is contained in:
letheriver2007
2024-11-15 08:54:08 +08:00
parent 885deb44e2
commit 6a68506bf0
13 changed files with 94 additions and 90 deletions

View File

@@ -20,6 +20,7 @@ public class TaskInfo
public List<TaskInfo> OnProjectileHit { get; set; } = [];
public List<TaskInfo> OnProjectileLifetimeFinish { get; set; } = [];
public string ModifierName { get; set; } = "";
public LifeTimeInfo LifeTime { get; set; } = new();
[JsonIgnore] public TaskTypeEnum TaskType { get; set; } = TaskTypeEnum.None;
@@ -35,6 +36,8 @@ public class TaskInfo
TaskType = TaskTypeEnum.AddMazeBuff;
else if (Type.Contains("RemoveMazeBuff"))
TaskType = TaskTypeEnum.RemoveMazeBuff;
else if (Type.Contains("AddAdventureModifier"))
TaskType = TaskTypeEnum.AddAdventureModifier;
else if (Type.Contains("AdventureModifyTeamPlayerHP"))
TaskType = TaskTypeEnum.AdventureModifyTeamPlayerHP;
else if (Type.Contains("AdventureModifyTeamPlayerSP"))
@@ -49,7 +52,8 @@ public class TaskInfo
TaskType = TaskTypeEnum.SuccessTaskList;
else if (Type.Contains("AdventureTriggerAttack"))
TaskType = TaskTypeEnum.AdventureTriggerAttack;
else if (Type.Contains("AdventureFireProjectile")) TaskType = TaskTypeEnum.AdventureFireProjectile;
else if (Type.Contains("AdventureFireProjectile"))
TaskType = TaskTypeEnum.AdventureFireProjectile;
}
public int GetID()

View File

@@ -8,5 +8,6 @@ public enum DamageTypeEnum
Thunder = 1000114,
Wind = 1000115,
Quantum = 1000116,
Imaginary = 1000117
Imaginary = 1000117,
All = 1000119 // Modified for AddAdventureModifier
}

View File

@@ -12,5 +12,6 @@ public enum TaskTypeEnum
SuccessTaskList = 7,
AdventureTriggerAttack = 8,
AdventureFireProjectile = 9,
DestroySummonUnit = 10
DestroySummonUnit = 10,
AddAdventureModifier = 11
}

View File

@@ -232,16 +232,13 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List<Stage
proto.BattleAvatarList.Add(avatar.Key.ToBattleProto(Player.LineupManager!.GetCurLineup()!,
Player.InventoryManager!.Data, avatar.Value));
System.Threading.Tasks.Task.Run(async () =>
{
foreach (var monster in EntityMonsters) await monster.ApplyBuff(this);
foreach (var monster in EntityMonsters) monster.ApplyBuff(this);
foreach (var avatar in AvatarInfo)
if (avatars.Keys.FirstOrDefault(x =>
x.GetSpecialAvatarId() == avatar.AvatarInfo.GetSpecialAvatarId()) !=
null) // if avatar is in lineup
await avatar.ApplyBuff(this);
}).Wait();
foreach (var avatar in AvatarInfo)
if (avatars.Keys.FirstOrDefault(x =>
x.GetSpecialAvatarId() == avatar.AvatarInfo.GetSpecialAvatarId()) !=
null) // if avatar is in lineup
avatar.ApplyBuff(this);
foreach (var eventInstance in BattleEvents.Values) proto.BattleEvent.Add(eventInstance.ToProto());
@@ -255,19 +252,22 @@ public class BattleInstance(PlayerInstance player, LineupInfo lineup, List<Stage
proto.BattleTargetInfo.Add((uint)i, battleTargetEntry);
}
// TODO: Confirm WaveFlag logic
foreach (var buff in Buffs)
{
if (buff.WaveFlag != null) continue;
// Single buff
var buffs = Buffs.FindAll(x => x.BuffID == buff.BuffID);
if (buffs.Count < 2) continue;
var count = 0;
if (buffs.Count > 1) continue;
foreach (var mazeBuff in buffs)
{
mazeBuff.WaveFlag = (int)Math.Pow(2, count);
count++;
mazeBuff.WaveFlag = 3;
}
}
foreach (var buff in Buffs) buff.WaveFlag ??= -1;
foreach (var buff in Buffs.Clone())
if (buff.BuffID == 122003) // Fei Xiao Maze Buff
Buffs.Add(new MazeBuff(122002, buff.BuffLevel, 0)

View File

@@ -1,6 +1,7 @@
using EggLink.DanhengServer.Data;
using EggLink.DanhengServer.Data.Excel;
using EggLink.DanhengServer.Database.Inventory;
using EggLink.DanhengServer.Enums.Avatar;
using EggLink.DanhengServer.GameServer.Game.Battle.Skill;
using EggLink.DanhengServer.GameServer.Game.Player;
using EggLink.DanhengServer.GameServer.Game.RogueMagic;
@@ -88,7 +89,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
Player.InventoryManager!.HandlePlaneEvent(prop.PropInfo.EventID);
}
Player.RogueManager!.GetRogueInstance()?.OnPropDestruct(prop);
if (Player.RogueManager!.GetRogueInstance() != null)
await Player.RogueManager!.GetRogueInstance()!.OnPropDestruct(prop);
}
if (targetList.Count > 0)
@@ -151,15 +153,21 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
.OfType<AvatarSceneInfo>());
MazeBuff? mazeBuff = null;
if (castAvatar != null)
if (castAvatar != null && skill != null)
{
var index = battleInstance.Lineup.BaseAvatars!.FindIndex(x =>
x.BaseAvatarId == castAvatar.AvatarInfo.AvatarId);
GameData.AvatarConfigData.TryGetValue(castAvatar.AvatarInfo.GetAvatarId(), out var avatarExcel);
if (avatarExcel != null)
{
mazeBuff = new MazeBuff((int)avatarExcel.DamageType, 1, index);
mazeBuff.DynamicValues.Add("SkillIndex", skill.IsMazeSkill ? 2 : 1);
var buffType = avatarExcel.DamageType;
if (skill.AdventureModifiers.Contains("ADV_StageAbility_Maze_IgnoreWeakness_MazeSkillMark"))
buffType = DamageTypeEnum.All;
mazeBuff = new MazeBuff((int)buffType, 1, index);
// TODO: Confirm SkillIndex value
mazeBuff.DynamicValues.Add("SkillIndex", 0);
}
}
else
@@ -193,7 +201,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, battleInstance,
hitMonsterInstance));
Player.SceneInstance?.ClearSummonUnit();
if (Player.SceneInstance != null) await Player.SceneInstance!.ClearSummonUnit();
}
else
{
@@ -242,7 +250,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
InvokeOnPlayerEnterBattle(player, battleInstance);
await Player.SendPacket(new PacketSceneEnterStageScRsp(battleInstance));
Player.SceneInstance?.ClearSummonUnit();
if (Player.SceneInstance != null) await Player.SceneInstance!.ClearSummonUnit();
}
public async ValueTask StartCocoonStage(int cocoonId, int wave, int worldLevel)
@@ -301,7 +309,7 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player)
InvokeOnPlayerEnterBattle(player, battleInstance);
await Player.SendPacket(new PacketStartCocoonStageScRsp(battleInstance, cocoonId, wave));
Player.SceneInstance?.ClearSummonUnit();
if (Player.SceneInstance != null) await Player.SceneInstance!.ClearSummonUnit();
}
public (Retcode, BattleInstance?) StartBattleCollege(int collegeId)

View File

@@ -28,6 +28,7 @@ public class MazeSkill
}
public List<IMazeSkillAction> Actions { get; } = [];
public HashSet<string> AdventureModifiers { get; } = [];
public bool TriggerBattle { get; private set; } = true;
public bool IsMazeSkill { get; } = true;
public AvatarConfigExcel? Excel { get; private set; }
@@ -44,6 +45,9 @@ public class MazeSkill
case TaskTypeEnum.RemoveMazeBuff:
Actions.Add(new MazeRemoveMazeBuff(task.ID));
break;
case TaskTypeEnum.AddAdventureModifier:
AdventureModifiers.Add(task.ModifierName);
break;
case TaskTypeEnum.AdventureModifyTeamPlayerHP:
break;
case TaskTypeEnum.AdventureModifyTeamPlayerSP:

View File

@@ -42,11 +42,21 @@ public class EntityMonster(
{
var oldBuff = BuffList.Find(x => x.BuffId == buff.BuffId);
if (oldBuff != null) BuffList.Remove(oldBuff);
BuffList.Add(buff);
await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, buff));
await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff], []));
}
public async ValueTask ApplyBuff(BattleInstance instance)
public async ValueTask RemoveBuff(int buffId)
{
var buff = BuffList.Find(x => x.BuffId == buffId);
if (buff == null) return;
BuffList.Remove(buff);
await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [], [buff]));
}
public void ApplyBuff(BattleInstance instance)
{
if (TempBuff != null)
{
@@ -62,8 +72,6 @@ public class EntityMonster(
instance.Buffs.Add(new MazeBuff(buff));
}
await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, BuffList));
BuffList.Clear();
}
@@ -100,15 +108,6 @@ public class EntityMonster(
return proto;
}
public async ValueTask RemoveBuff(int buffId)
{
var buff = BuffList.Find(x => x.BuffId == buffId);
if (buff == null) return;
BuffList.Remove(buff);
await Scene.Player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff]));
}
public int GetStageId()
{
if (CustomStageID > 0) return CustomStageID;

View File

@@ -20,10 +20,7 @@ public class EntityNpc(SceneInstance scene, GroupInfo group, NpcInfo npcInfo) :
await System.Threading.Tasks.Task.CompletedTask;
}
public async ValueTask ApplyBuff(BattleInstance instance)
{
await System.Threading.Tasks.Task.CompletedTask;
}
public void ApplyBuff(BattleInstance instance) { }
public virtual SceneEntityInfo ToProto()
{

View File

@@ -26,10 +26,7 @@ public class EntityProp(SceneInstance scene, MazePropExcel excel, GroupInfo grou
await System.Threading.Tasks.Task.CompletedTask;
}
public async ValueTask ApplyBuff(BattleInstance instance)
{
await System.Threading.Tasks.Task.CompletedTask;
}
public void ApplyBuff(BattleInstance instance) { }
public virtual SceneEntityInfo ToProto()
{

View File

@@ -24,10 +24,7 @@ public class EntitySummonUnit : IGameEntity
await ValueTask.CompletedTask;
}
public async ValueTask ApplyBuff(BattleInstance instance)
{
await ValueTask.CompletedTask;
}
public void ApplyBuff(BattleInstance instance) { }
public SceneEntityInfo ToProto()
{

View File

@@ -9,8 +9,7 @@ public interface IGameEntity
public int GroupID { get; set; }
public ValueTask AddBuff(SceneBuff buff);
public ValueTask ApplyBuff(BattleInstance instance);
public void ApplyBuff(BattleInstance instance);
public SceneEntityInfo ToProto();
}

View File

@@ -502,31 +502,17 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe
}
else
{
// Update old buff's duration
oldBuff.CreatedTime = Extensions.GetUnixMs();
oldBuff.Duration = buff.Duration;
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, oldBuff));
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff], []));
return;
}
}
BuffList.Add(buff);
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, buff));
}
public async ValueTask ApplyBuff(BattleInstance instance)
{
if (BuffList.Count == 0) return;
foreach (var buff in BuffList.Where(buff => !buff.IsExpired())) instance.Buffs.Add(new MazeBuff(buff));
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, BuffList));
BuffList.Clear();
}
public SceneEntityInfo ToProto()
{
return AvatarInfo.ToSceneEntityInfo(AvatarType);
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff], []));
}
public async ValueTask RemoveBuff(int buffId)
@@ -535,6 +521,16 @@ public class AvatarSceneInfo(AvatarInfo avatarInfo, AvatarType avatarType, Playe
if (buff == null) return;
BuffList.Remove(buff);
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [buff]));
await player.SendPacket(new PacketSyncEntityBuffChangeListScNotify(this, [], [buff]));
}
public void ApplyBuff(BattleInstance instance)
{
if (BuffList.Count == 0) return;
foreach (var buff in BuffList.Where(buff => !buff.IsExpired())) instance.Buffs.Add(new MazeBuff(buff));
BuffList.Clear();
}
public SceneEntityInfo ToProto() => AvatarInfo.ToSceneEntityInfo(AvatarType);
}

View File

@@ -7,33 +7,34 @@ namespace EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene;
public class PacketSyncEntityBuffChangeListScNotify : BasePacket
{
public PacketSyncEntityBuffChangeListScNotify(IGameEntity entity, SceneBuff buff) : base(
public PacketSyncEntityBuffChangeListScNotify(
IGameEntity entity, List<SceneBuff> addBuffs, List<SceneBuff> removeBuffs) : base(
CmdIds.SyncEntityBuffChangeListScNotify)
{
var proto = new SyncEntityBuffChangeListScNotify();
var change = new EntityBuffChangeInfo
if (addBuffs!= null)
{
EntityId = (uint)entity.EntityID,
BuffChangeInfo = buff.ToProto()
};
proto.EntityBuffChangeList.Add(change);
SetData(proto);
}
public PacketSyncEntityBuffChangeListScNotify(IGameEntity entity, List<SceneBuff> buffs) : base(
CmdIds.SyncEntityBuffChangeListScNotify)
{
var proto = new SyncEntityBuffChangeListScNotify();
foreach (var buff in buffs)
{
var change = new EntityBuffChangeInfo
foreach (var buff in addBuffs)
{
EntityId = (uint)entity.EntityID,
RemoveBuffId = (uint)buff.BuffId
};
proto.EntityBuffChangeList.Add(change);
var add = new EntityBuffChangeInfo
{
EntityId = (uint)entity.EntityID,
BuffChangeInfo = buff.ToProto()
};
proto.EntityBuffChangeList.Add(add);
}
}
if (removeBuffs!= null)
{
foreach (var buff in removeBuffs)
{
var remove = new EntityBuffChangeInfo
{
EntityId = (uint)entity.EntityID,
RemoveBuffId = (uint)buff.BuffId
};
proto.EntityBuffChangeList.Add(remove);
}
}
SetData(proto);