From bbe209bcd4190f4cdeaebf612728af74a24bf5f6 Mon Sep 17 00:00:00 2001 From: starfish <50672801+starfi5h@users.noreply.github.com> Date: Sat, 20 Jul 2024 05:11:59 +0800 Subject: [PATCH] Sync damage to space enemy by mecha fleet --- .../Packets/Combat/CombatStatDamagePacket.cs | 29 ++++++++++ .../Combat/CombatStatDamageProcessor.cs | 54 +++++++++++++++++++ .../Patches/Dynamic/SkillSystem_Patch.cs | 16 ++++++ 3 files changed, 99 insertions(+) create mode 100644 NebulaModel/Packets/Combat/CombatStatDamagePacket.cs create mode 100644 NebulaNetwork/PacketProcessors/Combat/CombatStatDamageProcessor.cs diff --git a/NebulaModel/Packets/Combat/CombatStatDamagePacket.cs b/NebulaModel/Packets/Combat/CombatStatDamagePacket.cs new file mode 100644 index 000000000..cb0343a09 --- /dev/null +++ b/NebulaModel/Packets/Combat/CombatStatDamagePacket.cs @@ -0,0 +1,29 @@ +using System.Security.Policy; + +namespace NebulaModel.Packets.Combat; + +public class CombatStatDamagePacket +{ + public CombatStatDamagePacket() { } + + public CombatStatDamagePacket(int damage, int slice, in SkillTarget target, in SkillTarget caster) + { + Damage = damage; + Slice = slice; + TargetType = (short)target.type; + TargetId = target.id; + TargetAstroId = target.astroId; + CasterType = (short)caster.type; + CasterId = caster.id; + CasterAstroId = caster.astroId; + } + + public int Damage { get; set; } + public int Slice { get; set; } + public short TargetType { get; set; } + public int TargetId { get; set; } + public int TargetAstroId { get; set; } + public short CasterType { get; set; } + public int CasterId { get; set; } + public int CasterAstroId { get; set; } +} diff --git a/NebulaNetwork/PacketProcessors/Combat/CombatStatDamageProcessor.cs b/NebulaNetwork/PacketProcessors/Combat/CombatStatDamageProcessor.cs new file mode 100644 index 000000000..ad90f82fd --- /dev/null +++ b/NebulaNetwork/PacketProcessors/Combat/CombatStatDamageProcessor.cs @@ -0,0 +1,54 @@ +#region + +using NebulaAPI.Packets; +using NebulaModel.Networking; +using NebulaModel.Packets; +using NebulaModel.Packets.Combat; +using NebulaWorld; + +#endregion + +namespace NebulaNetwork.PacketProcessors.Combat; + +[RegisterPacketProcessor] +public class CombatStatDamageProcessor : PacketProcessor +{ + protected override void ProcessPacket(CombatStatDamagePacket packet, NebulaConnection conn) + { + if (IsHost) + { + Multiplayer.Session.Server.SendPacketExclude(packet, conn); + } + + SkillTarget target; + target.type = (ETargetType)packet.TargetType; + target.id = packet.TargetId; + target.astroId = packet.TargetAstroId; + SkillTarget caster; + caster.type = (ETargetType)packet.CasterType; + caster.id = packet.CasterId; + caster.astroId = packet.CasterAstroId; + + if (target.type != ETargetType.Enemy) return; // Guard + + var astroId = target.astroId; + if (astroId > 1000000) + { + if (target.id >= GameMain.spaceSector.enemyPool.Length) + { + // Return if enemyId is not exist in client + return; + } + } + else if (astroId > 100 && astroId <= 204899 && astroId % 100 > 0) + { + var factory = GameMain.spaceSector.skillSystem.astroFactories[astroId]; + if (factory == null || target.id >= factory.enemyPool.Length) return; + } + + using (Multiplayer.Session.Combat.IsIncomingRequest.On()) + { + GameMain.spaceSector.skillSystem.DamageObject(packet.Damage, packet.Slice, ref target, ref caster); + } + } +} diff --git a/NebulaPatcher/Patches/Dynamic/SkillSystem_Patch.cs b/NebulaPatcher/Patches/Dynamic/SkillSystem_Patch.cs index e35927ea6..f69e51838 100644 --- a/NebulaPatcher/Patches/Dynamic/SkillSystem_Patch.cs +++ b/NebulaPatcher/Patches/Dynamic/SkillSystem_Patch.cs @@ -2,6 +2,7 @@ using System.IO; using HarmonyLib; +using NebulaModel.Packets.Combat; using NebulaWorld; #endregion @@ -85,4 +86,19 @@ public static bool MechaEnergyShieldResist_Prefix(SkillSystem __instance, ref bo __result = true; return false; } + + [HarmonyPrefix] + [HarmonyPatch(nameof(SkillSystem.DamageObject))] + public static void DamageObject_Prefix(int damage, int slice, ref SkillTarget target, ref SkillTarget caster) + { + if (caster.type != ETargetType.Craft || target.type != ETargetType.Enemy + || target.astroId <= 1000000 // Only sync for space target + || !Multiplayer.IsActive || Multiplayer.Session.Combat.IsIncomingRequest.Value) return; + + var packet = new CombatStatDamagePacket(damage, slice, in target, in caster); + // Change the caster to player as craft (space fleet) is not sync yet + packet.CasterType = (short)ETargetType.Player; + packet.CasterId = Multiplayer.Session.LocalPlayer.Id; + Multiplayer.Session.Network.SendPacket(packet); + } }