diff --git a/Command/Command/CommandManager.cs b/Command/Command/CommandManager.cs index faf7356b..17521cbe 100644 --- a/Command/Command/CommandManager.cs +++ b/Command/Command/CommandManager.cs @@ -4,6 +4,7 @@ using EggLink.DanhengServer.Internationalization; using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Util; using Spectre.Console; +using static EggLink.DanhengServer.GameServer.Plugin.Event.PluginEvent; namespace EggLink.DanhengServer.Command.Command; @@ -173,6 +174,7 @@ public class CommandManager } else { + InvokeOnPlayerUseCommand(sender, input); // player tempTarget = Listener.GetActiveConnection(sender.GetSender()); if (tempTarget == null) diff --git a/GameServer/Game/Battle/BattleManager.cs b/GameServer/Game/Battle/BattleManager.cs index 5db612dc..ba54d12d 100644 --- a/GameServer/Game/Battle/BattleManager.cs +++ b/GameServer/Game/Battle/BattleManager.cs @@ -11,6 +11,7 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.Lineup; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; +using static EggLink.DanhengServer.GameServer.Plugin.Event.PluginEvent; namespace EggLink.DanhengServer.GameServer.Game.Battle; @@ -188,6 +189,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) hitMonsterInstance.AddRange(targetList.Where(x => !x.IsAlive).Select(entityMonster => new HitMonsterInstance(entityMonster.EntityID, MonsterBattleType.DirectDieSkipBattle))); + InvokeOnPlayerEnterBattle(player, battleInstance); + await Player.SendPacket(new PacketSceneCastSkillScRsp(req.CastEntityId, battleInstance, hitMonsterInstance)); Player.SceneInstance?.ClearSummonUnit(); @@ -236,6 +239,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) Player.BattleInstance = battleInstance; + InvokeOnPlayerEnterBattle(player, battleInstance); + await Player.SendPacket(new PacketSceneEnterStageScRsp(battleInstance)); Player.SceneInstance?.ClearSummonUnit(); } @@ -293,6 +298,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) Player.BattleInstance = battleInstance; Player.QuestManager!.OnBattleStart(battleInstance); + InvokeOnPlayerEnterBattle(player, battleInstance); + await Player.SendPacket(new PacketStartCocoonStageScRsp(battleInstance, cocoonId, wave)); Player.SceneInstance?.ClearSummonUnit(); } @@ -328,6 +335,8 @@ public class BattleManager(PlayerInstance player) : BasePlayerManager(player) public async ValueTask EndBattle(PVEBattleResultCsReq req) { + InvokeOnPlayerQuitBattle(player, req); + if (Player.BattleInstance == null) { await Player.SendPacket(new PacketPVEBattleResultScRsp()); diff --git a/GameServer/Game/Challenge/ChallengeManager.cs b/GameServer/Game/Challenge/ChallengeManager.cs index 945fb0c7..00450ea9 100644 --- a/GameServer/Game/Challenge/ChallengeManager.cs +++ b/GameServer/Game/Challenge/ChallengeManager.cs @@ -5,6 +5,7 @@ using EggLink.DanhengServer.Database.Inventory; using EggLink.DanhengServer.GameServer.Game.Player; using EggLink.DanhengServer.GameServer.Server.Packet.Send.Challenge; using EggLink.DanhengServer.Proto; +using static EggLink.DanhengServer.GameServer.Plugin.Event.PluginEvent; namespace EggLink.DanhengServer.GameServer.Game.Challenge; @@ -119,6 +120,8 @@ public class ChallengeManager(PlayerInstance player) : BasePlayerManager(player) instance.BossBuffs.Add((int)bossBuffs.BuffTwo); } + InvokeOnPlayerEnterChallenge(player, instance); + // Send packet await Player.SendPacket(new PacketStartChallengeScRsp(Player)); diff --git a/GameServer/Game/Lineup/LineupManager.cs b/GameServer/Game/Lineup/LineupManager.cs index 11293584..5b316aeb 100644 --- a/GameServer/Game/Lineup/LineupManager.cs +++ b/GameServer/Game/Lineup/LineupManager.cs @@ -9,6 +9,7 @@ using EggLink.DanhengServer.GameServer.Server.Packet.Send.Scene; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; using LineupInfo = EggLink.DanhengServer.Database.Lineup.LineupInfo; +using static EggLink.DanhengServer.GameServer.Plugin.Event.PluginEvent; namespace EggLink.DanhengServer.GameServer.Game.Lineup; @@ -43,7 +44,9 @@ public class LineupManager : BasePlayerManager public LineupInfo? GetCurLineup() { - return GetLineup(LineupData.GetCurLineupIndex()); + LineupInfo? lineup = GetLineup(LineupData.GetCurLineupIndex()); + InvokeOnPlayerSyncLineup(Player, lineup); + return lineup; } public List GetAvatarsFromTeam(int index) @@ -226,6 +229,7 @@ public class LineupManager : BasePlayerManager if (sendPacket) { if (lineupIndex == LineupData.GetCurLineupIndex()) Player.SceneInstance?.SyncLineup(); + InvokeOnPlayerSyncLineup(Player, lineup); await Player.SendPacket(new PacketSyncLineupNotify(lineup)); } } @@ -264,6 +268,7 @@ public class LineupManager : BasePlayerManager if (sendPacket) { Player.SceneInstance?.SyncLineup(); + InvokeOnPlayerSyncLineup(Player, lineup); await Player.SendPacket(new PacketSyncLineupNotify(lineup)); } } @@ -283,6 +288,7 @@ public class LineupManager : BasePlayerManager if (sendPacket) { if (lineupIndex == LineupData.GetCurLineupIndex()) Player.SceneInstance?.SyncLineup(); + InvokeOnPlayerSyncLineup(Player, lineup); await Player.SendPacket(new PacketSyncLineupNotify(lineup)); } } @@ -313,6 +319,7 @@ public class LineupManager : BasePlayerManager foreach (var avatar in lineupSlotList) await AddAvatar(index, avatar, false); if (index == LineupData.GetCurLineupIndex()) Player.SceneInstance?.SyncLineup(); + InvokeOnPlayerSyncLineup(Player, lineup); await Player.SendPacket(new PacketSyncLineupNotify(lineup)); } @@ -336,6 +343,7 @@ public class LineupManager : BasePlayerManager foreach (var avatar in req.LineupSlotList) await AddAvatar(index, (int)avatar.Id, false); if (index == LineupData.GetCurLineupIndex()) Player.SceneInstance?.SyncLineup(); + InvokeOnPlayerSyncLineup(Player, lineup); await Player.SendPacket(new PacketSyncLineupNotify(lineup)); } diff --git a/GameServer/Game/Player/PlayerInstance.cs b/GameServer/Game/Player/PlayerInstance.cs index f08ac702..08998f4c 100644 --- a/GameServer/Game/Player/PlayerInstance.cs +++ b/GameServer/Game/Player/PlayerInstance.cs @@ -643,6 +643,7 @@ public class PlayerInstance(PlayerData data) Data.Rot = rot; var notSendMove = true; SceneInstance instance = new(this, plane, floorId, entryId); + InvokeOnPlayerLoadScene(this, instance); if (planeId != Data.PlaneId || floorId != Data.FloorId || entryId != Data.EntryId) { Data.PlaneId = planeId; diff --git a/GameServer/Plugin/Event/PluginEvent.cs b/GameServer/Plugin/Event/PluginEvent.cs index 1a7447ca..9f7ba1af 100644 --- a/GameServer/Plugin/Event/PluginEvent.cs +++ b/GameServer/Plugin/Event/PluginEvent.cs @@ -1,5 +1,10 @@ -using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.Command; +using EggLink.DanhengServer.GameServer.Game.Battle; +using EggLink.DanhengServer.GameServer.Game.Challenge; +using EggLink.DanhengServer.GameServer.Game.Player; +using EggLink.DanhengServer.GameServer.Game.Scene; using EggLink.DanhengServer.GameServer.Game.Scene.Entity; +using EggLink.DanhengServer.Proto; namespace EggLink.DanhengServer.GameServer.Plugin.Event; @@ -35,6 +40,35 @@ public static class PluginEvent OnPlayerInteract?.Invoke(player, prop); } + public static void InvokeOnPlayerLoadScene(PlayerInstance player, SceneInstance scene) + { + OnPlayerLoadScene?.Invoke(player, scene); + } + public static void InvokeOnPlayerEnterBattle(PlayerInstance player, BattleInstance battle) + { + OnPlayerEnterBattle?.Invoke(player, battle); + } + public static void InvokeOnPlayerQuitBattle(PlayerInstance player, PVEBattleResultCsReq result) + { + OnPlayerQuitBattle?.Invoke(player, result); + } + public static void InvokeOnPlayerEnterChallenge(PlayerInstance player, ChallengeInstance? challenge) + { + OnPlayerEnterChallenge?.Invoke(player, challenge); + } + public static void InvokeOnPlayerQuitChallenge(PlayerInstance player, ChallengeInstance? challenge) + { + OnPlayerQuitChallenge?.Invoke(player, challenge); + } + public static void InvokeOnPlayerSyncLineup(PlayerInstance player, Database.Lineup.LineupInfo? lineup) + { + OnPlayerSyncLineup?.Invoke(player, lineup); + } + public static void InvokeOnPlayerUseCommand(ICommandSender sender, string command) + { + OnPlayerUseCommand?.Invoke(sender, command); + } + #region Player public delegate void OnPlayerHeartBeatHandler(PlayerInstance player); @@ -49,6 +83,20 @@ public static class PluginEvent public delegate void OnPlayerInteractHandler(PlayerInstance player, EntityProp prop); + public delegate void OnPlayerLoadSceneHandler(PlayerInstance player, SceneInstance scene); + + public delegate void OnPlayerEnterBattleHandler(PlayerInstance player, BattleInstance battle); + + public delegate void OnPlayerQuitBattleHandler(PlayerInstance player, PVEBattleResultCsReq result); + + public delegate void OnPlayerEnterChallengeHandler(PlayerInstance player, ChallengeInstance? challenge); + + public delegate void OnPlayerQuitChallengeHandler(PlayerInstance player, ChallengeInstance? challenge); + + public delegate void OnPlayerSyncLineupHandler(PlayerInstance player, Database.Lineup.LineupInfo? lineup); + + public delegate void OnPlayerUseCommandHandler(ICommandSender sender, string command); + #endregion #region Common @@ -63,6 +111,13 @@ public static class PluginEvent public static event OnPlayerFinishSubMissionHandler? OnPlayerFinishSubMission; public static event OnPlayerFinishMainMissionHandler? OnPlayerFinishMainMission; public static event OnPlayerInteractHandler? OnPlayerInteract; + public static event OnPlayerLoadSceneHandler? OnPlayerLoadScene; + public static event OnPlayerEnterBattleHandler? OnPlayerEnterBattle; + public static event OnPlayerEnterChallengeHandler? OnPlayerEnterChallenge; + public static event OnPlayerQuitBattleHandler? OnPlayerQuitBattle; + public static event OnPlayerQuitChallengeHandler? OnPlayerQuitChallenge; + public static event OnPlayerSyncLineupHandler? OnPlayerSyncLineup; + public static event OnPlayerUseCommandHandler? OnPlayerUseCommand; #endregion } \ No newline at end of file diff --git a/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs b/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs index 942d1044..9ecb769c 100644 --- a/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs +++ b/GameServer/Server/Packet/Recv/Challenge/HandlerLeaveChallengeCsReq.cs @@ -1,6 +1,7 @@ using EggLink.DanhengServer.Kcp; using EggLink.DanhengServer.Proto; using EggLink.DanhengServer.Util; +using static EggLink.DanhengServer.GameServer.Plugin.Event.PluginEvent; namespace EggLink.DanhengServer.GameServer.Server.Packet.Recv.Challenge; @@ -21,6 +22,8 @@ public class HandlerLeaveChallengeCsReq : Handler player.LineupManager!.SetExtraLineup(ExtraLineupType.LineupChallenge, []); player.LineupManager.SetExtraLineup(ExtraLineupType.LineupChallenge2, []); + InvokeOnPlayerQuitChallenge(player, player.ChallengeManager!.ChallengeInstance); + player.ChallengeManager!.ChallengeInstance = null; player.ChallengeManager!.ClearInstance();