-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add basic sync for PvP (only allowed with knifes and heatblades for now)
- Loading branch information
1 parent
8abb67b
commit df9fb08
Showing
7 changed files
with
180 additions
and
5 deletions.
There are no files selected for viewing
20 changes: 20 additions & 0 deletions
20
Nitrox.Test/Patcher/Patches/Dynamic/Knife_OnToolUseAnim_PatchTest.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
using System.Collections.Generic; | ||
using System.Linq; | ||
using FluentAssertions; | ||
using HarmonyLib; | ||
using Microsoft.VisualStudio.TestTools.UnitTesting; | ||
using NitroxTest.Patcher; | ||
|
||
namespace NitroxPatcher.Patches.Dynamic; | ||
|
||
[TestClass] | ||
public class Knife_OnToolUseAnim_PatchTest | ||
{ | ||
[TestMethod] | ||
public void Sanity() | ||
{ | ||
IEnumerable<CodeInstruction> originalIl = PatchTestHelper.GetInstructionsFromMethod(Knife_OnToolUseAnim_Patch.TARGET_METHOD); | ||
IEnumerable<CodeInstruction> transformedIl = Knife_OnToolUseAnim_Patch.Transpiler(originalIl); | ||
transformedIl.Count().Should().Be(originalIl.Count()); | ||
} | ||
} |
15 changes: 15 additions & 0 deletions
15
NitroxClient/Communication/Packets/Processors/PvPAttackProcessor.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
using NitroxClient.Communication.Packets.Processors.Abstract; | ||
using NitroxModel.Packets; | ||
|
||
namespace NitroxClient.Communication.Packets.Processors; | ||
|
||
public class PvPAttackProcessor : ClientPacketProcessor<PvPAttack> | ||
{ | ||
public override void Process(PvPAttack packet) | ||
{ | ||
if (Player.main && Player.main.liveMixin) | ||
{ | ||
Player.main.liveMixin.TakeDamage(packet.Damage); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,24 @@ | ||
using System; | ||
|
||
namespace NitroxModel.Packets; | ||
|
||
[Serializable] | ||
public class PvPAttack : Packet | ||
{ | ||
public string TargetPlayerName { get; } | ||
public float Damage { get; set; } | ||
public AttackType Type { get; } | ||
|
||
public PvPAttack(string targetPlayerName, float damage, AttackType type) | ||
{ | ||
TargetPlayerName = targetPlayerName; | ||
Damage = damage; | ||
Type = type; | ||
} | ||
|
||
public enum AttackType | ||
{ | ||
KnifeHit, | ||
HeatbladeHit | ||
} | ||
} |
36 changes: 36 additions & 0 deletions
36
NitroxPatcher/Patches/Dynamic/Knife_OnToolUseAnim_Patch.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
using System.Collections.Generic; | ||
using System.Reflection; | ||
using System.Reflection.Emit; | ||
using HarmonyLib; | ||
using NitroxModel.Helper; | ||
|
||
namespace NitroxPatcher.Patches.Dynamic; | ||
|
||
/// <summary> | ||
/// Registers knife hits's dealer as the main Player object | ||
/// </summary> | ||
public sealed partial class Knife_OnToolUseAnim_Patch : NitroxPatch, IDynamicPatch | ||
{ | ||
public static readonly MethodInfo TARGET_METHOD = Reflect.Method((Knife t) => t.OnToolUseAnim(default)); | ||
|
||
/* | ||
* | ||
* bool flag = liveMixin.IsAlive(); | ||
* REPLACE below line | ||
* liveMixin.TakeDamage(this.damage, vector, this.damageType, null); | ||
* BY: | ||
* liveMixin.TakeDamage(this.damage, vector, this.damageType, Player.mainObject); | ||
* this.GiveResourceOnDamage(gameObject, liveMixin.IsAlive(), flag); | ||
*/ | ||
public static IEnumerable<CodeInstruction> Transpiler(IEnumerable<CodeInstruction> instructions) | ||
{ | ||
return new CodeMatcher(instructions).MatchEndForward([ | ||
new CodeMatch(OpCodes.Ldloc_0), | ||
new CodeMatch(OpCodes.Ldarg_0), | ||
new CodeMatch(OpCodes.Ldfld), | ||
new CodeMatch(OpCodes.Ldnull) | ||
]) | ||
.Set(OpCodes.Ldsfld, Reflect.Field(() => Player.mainObject)) | ||
.InstructionEnumeration(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
37 changes: 37 additions & 0 deletions
37
NitroxServer/Communication/Packets/Processors/PvPAttackProcessor.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
using System.Collections.Generic; | ||
using NitroxModel.Packets; | ||
using NitroxServer.Communication.Packets.Processors.Abstract; | ||
using NitroxServer.GameLogic; | ||
using NitroxServer.Serialization; | ||
|
||
namespace NitroxServer.Communication.Packets.Processors; | ||
|
||
public class PvPAttackProcessor : AuthenticatedPacketProcessor<PvPAttack> | ||
{ | ||
private readonly ServerConfig serverConfig; | ||
private readonly PlayerManager playerManager; | ||
|
||
// TODO: In the future, do a whole config for damage sources | ||
private static readonly Dictionary<PvPAttack.AttackType, float> DamageMultiplierByType = new() | ||
{ | ||
{ PvPAttack.AttackType.KnifeHit, 0.5f }, | ||
{ PvPAttack.AttackType.HeatbladeHit, 1f } | ||
}; | ||
|
||
public PvPAttackProcessor(ServerConfig serverConfig, PlayerManager playerManager) | ||
{ | ||
this.serverConfig = serverConfig; | ||
this.playerManager = playerManager; | ||
} | ||
|
||
public override void Process(PvPAttack packet, Player player) | ||
{ | ||
if (serverConfig.PvPEnabled && | ||
playerManager.TryGetPlayerByName(packet.TargetPlayerName, out Player targetPlayer) && | ||
DamageMultiplierByType.TryGetValue(packet.Type, out float multiplier)) | ||
{ | ||
packet.Damage *= multiplier; | ||
targetPlayer.SendPacket(packet); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters