mirror of
https://github.com/EggLinks/DanhengServer-OpenSource.git
synced 2026-01-02 12:16:03 +08:00
Fix some of technique bugs
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -8,5 +8,6 @@ public enum DamageTypeEnum
|
||||
Thunder = 1000114,
|
||||
Wind = 1000115,
|
||||
Quantum = 1000116,
|
||||
Imaginary = 1000117
|
||||
Imaginary = 1000117,
|
||||
All = 1000119 // Modified for AddAdventureModifier
|
||||
}
|
||||
@@ -12,5 +12,6 @@ public enum TaskTypeEnum
|
||||
SuccessTaskList = 7,
|
||||
AdventureTriggerAttack = 8,
|
||||
AdventureFireProjectile = 9,
|
||||
DestroySummonUnit = 10
|
||||
DestroySummonUnit = 10,
|
||||
AddAdventureModifier = 11
|
||||
}
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user