From 83e11c0f622e5290a55a47dfdcf33dd80608d1bb Mon Sep 17 00:00:00 2001
From: Ny Bruker <robinhs@stud.ntnu.no>
Date: Fri, 30 Sep 2022 16:28:46 +0200
Subject: [PATCH] OnHit & OnTakeDamage. - Added code to trigger the events. -
 Added Actor prop to AttackStats so we can see where the damage came from.

---
 MrBigsock/Assets/Code/Character.cs             | 10 ++++++++++
 MrBigsock/Assets/Code/Core/AttackStats.cs      |  5 +++++
 MrBigsock/Assets/Code/Core/IAttackStats.cs     |  4 ++++
 MrBigsock/Assets/Code/PlayerController.cs      | 12 +++---------
 MrBigsock/Assets/Code/attack/AttackMovement.cs | 12 ++++++++++++
 5 files changed, 34 insertions(+), 9 deletions(-)

diff --git a/MrBigsock/Assets/Code/Character.cs b/MrBigsock/Assets/Code/Character.cs
index f7564239..5614e91c 100644
--- a/MrBigsock/Assets/Code/Character.cs
+++ b/MrBigsock/Assets/Code/Character.cs
@@ -160,6 +160,8 @@ namespace BigSock {
 			// Start new IFrames
 			NextTimeCanTakeDamage = DateTime.Now + IFrameDuration;
 
+			// Trigger the event for taking damage.
+			OnTakeDamage?.Invoke(this, attack?.Actor, attack);
 
 			// Add damage
 			HP -= attack.Damage;
@@ -273,6 +275,14 @@ namespace BigSock {
 	*/
 	public partial class Character {
 
+		/*
+			Trigers the OnHit event.
+		*/
+		public void TargetHit(Character target, AttackStats attack) {
+			OnHit?.Invoke(this, target, attack);
+		}
+
+
 		/*
 			Triggers when character uses an attack.
 			Params: actor, attack stats.
diff --git a/MrBigsock/Assets/Code/Core/AttackStats.cs b/MrBigsock/Assets/Code/Core/AttackStats.cs
index 3c46627a..6eac3a66 100644
--- a/MrBigsock/Assets/Code/Core/AttackStats.cs
+++ b/MrBigsock/Assets/Code/Core/AttackStats.cs
@@ -36,5 +36,10 @@ namespace BigSock {
 		*/
 		public Vector2 Source { get; set; }
 
+		/*
+			The character that activated the attack.
+		*/
+		public Character Actor { get; set; }
+
 	}
 }
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Core/IAttackStats.cs b/MrBigsock/Assets/Code/Core/IAttackStats.cs
index a097916a..ea103727 100644
--- a/MrBigsock/Assets/Code/Core/IAttackStats.cs
+++ b/MrBigsock/Assets/Code/Core/IAttackStats.cs
@@ -36,5 +36,9 @@ namespace BigSock {
 		*/
 		Vector2 Source { get; }
 
+		/*
+			The character that activated the attack.
+		*/
+		Character Actor { get; }
 	}
 }
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/PlayerController.cs b/MrBigsock/Assets/Code/PlayerController.cs
index 95ef3e8c..7fcca510 100644
--- a/MrBigsock/Assets/Code/PlayerController.cs
+++ b/MrBigsock/Assets/Code/PlayerController.cs
@@ -95,16 +95,10 @@ namespace BigSock {
 					if(NextTimeCanAttack <= DateTime.Now) {
 						NextTimeCanAttack = DateTime.Now.AddSeconds(AttackCooldown);
 
-						Instantiate(attack, new Vector3(transform.position.x, transform.position.y, transform.position.z), attack.transform.rotation);
-						//if(movementInput.x < 0 ) {
-						//	Instantiate(attack, new Vector3(transform.position.x - 1.0f, transform.position.y, transform.position.z), attack.transform.rotation);
-						//} else if(movementInput.x >= 0) {
-						//	Instantiate(attack, new Vector3(transform.position.x + 1.0f, transform.position.y, transform.position.z), attack.transform.rotation);
-						//}
-
-					}
-
+						var bullet = Instantiate(attack, new Vector3(transform.position.x, transform.position.y, transform.position.z), attack.transform.rotation);
+						bullet.GetComponent<AttackMovement>().Actor = this;
 					
+					}
 				}
 
 				//!! Code for testing the new item stuff.
diff --git a/MrBigsock/Assets/Code/attack/AttackMovement.cs b/MrBigsock/Assets/Code/attack/AttackMovement.cs
index 4768aed3..30c7f101 100644
--- a/MrBigsock/Assets/Code/attack/AttackMovement.cs
+++ b/MrBigsock/Assets/Code/attack/AttackMovement.cs
@@ -21,6 +21,10 @@ namespace BigSock {
 		public float KnockbackForce => knockbackForce;
 		public float knockbackForce = 1;
 
+		/*
+			The character that activated the attack.
+		*/
+		public Character Actor { get; set; }
 
 		// Start is called before the first frame update
 		void Start()
@@ -60,8 +64,16 @@ namespace BigSock {
 					//Range = 0,
 					//AttackSpeed = AttackSpeed,
 					Source = transform.position,
+					Actor = Actor,
 				};
 
+				// If we have an actor: Apply their stat mods & trigger their OnHit.
+				if(Actor != null) {
+					attack.Damage *= Actor.Damage;
+					attack.Knockback *= Actor.KnockbackForce;
+					Actor.TargetHit(target, attack);
+				}
+
 				if(target.TakeDamage(attack)) {
 					
 				}
-- 
GitLab