TeletubProd

player_dmg

Jun 27th, 2022 (edited)
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.66 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. public class player_dmg : MonoBehaviour
  6. {
  7.     [Header("Vie")]
  8.     public float invTimer = 0.6f;
  9.     public int maxHP = 100, HP, DEF;
  10.     public float knockDelay;
  11.     [Header("Sons")]
  12.     public AudioClip[] hurtSounds;
  13.     AudioSource audsource;
  14.  
  15.     Coroutine invCor, knocked;
  16.     SpriteRenderer spre;
  17.     player_input pl_input;
  18.     player_mvt pl_mvt;
  19.     Rigidbody2D rb;
  20.  
  21.     void Start()
  22.     {
  23.         audsource = GetComponent<AudioSource>();
  24.         spre = GetComponent<SpriteRenderer>();
  25.         pl_input = GetComponent<player_input>();
  26.         pl_mvt = GetComponent<player_mvt>();
  27.         rb = GetComponent<Rigidbody2D>();
  28.  
  29.         HP = player_stats.MAXHP();
  30.         StartCoroutine(HPCheck());
  31.     }
  32.  
  33.     IEnumerator HPCheck()
  34.     {
  35.         int hp = HP;
  36.         while(true)
  37.         {
  38.             yield return new WaitUntil(() => HP != hp);
  39.             hp = HP;
  40.  
  41.             if(HP >  player_stats.MAXHP())
  42.             {
  43.                 HP =  player_stats.MAXHP();
  44.             }
  45.         }
  46.     }
  47.    
  48.  
  49.     void OnTriggerEnter2D(Collider2D target)
  50.     {
  51.         if(target.gameObject.tag == "noDmg") return;
  52.         if(target.gameObject.layer == 8 || target.gameObject.layer == 15) GetDmg(target);
  53.     }
  54.  
  55.     void OnTriggerStay2D(Collider2D target)
  56.     {
  57.         if(target.gameObject.tag == "noDmg") return;
  58.         if(target.gameObject.layer == 8 || target.gameObject.layer == 15) GetDmg(target);
  59.     }
  60.  
  61.     public void GetDmg(int dmg, float knock, Collider2D target)
  62.     {
  63.         if(invCor != null) return;
  64.         GetInv();
  65.  
  66.         SendMessage("GotHit", null, SendMessageOptions.DontRequireReceiver);
  67.  
  68.         if(audsource != null && hurtSounds.Length > 0)
  69.         {
  70.             audsource.clip = hurtSounds[Random.Range(0,hurtSounds.Length)];
  71.             audsource.Play();
  72.         }
  73.  
  74.         Vector2 knockPos = target.bounds.center;
  75.         if(knocked == null)
  76.         {
  77.             knocked = StartCoroutine(KnockBack(knock, knockPos));
  78.         }
  79.  
  80.         HP -= CalcDmg(dmg);
  81.     }
  82.  
  83.     public void GetDmg(Collider2D target)
  84.     {
  85.         monster_engine mnr = target?.attachedRigidbody?.GetComponent<monster_engine>();
  86.         if (mnr == null) return;
  87.        
  88.         if(invCor != null) return;
  89.         GetInv();
  90.  
  91.         SendMessage("GotHit", null, SendMessageOptions.DontRequireReceiver);
  92.  
  93.         if(audsource != null && hurtSounds.Length > 0)
  94.         {
  95.             audsource.clip = hurtSounds[Random.Range(0,hurtSounds.Length)];
  96.             audsource.Play();
  97.         }
  98.  
  99.         Vector2 knockPos = target.bounds.center;
  100.         if(knocked == null)
  101.         {
  102.             knocked = StartCoroutine(KnockBack(mnr.Knockback, knockPos));
  103.         }
  104.  
  105.         HP -= CalcDmg(mnr.DMG);
  106.     }
  107.  
  108.     public void GetInv()
  109.     {
  110.         if(invCor != null) return;
  111.         invCor = StartCoroutine(invCoroutine());
  112.     }
  113.  
  114.     IEnumerator KnockBack(float knockback, Vector2 hitPos)
  115.     {
  116.         pl_input.enabled = false;
  117.         pl_mvt.can_move = false;
  118.  
  119.         Vector2 direction = (Vector2)transform.position - hitPos;
  120.         Vector2 knk = direction.normalized * KnockCalc(knockback, timst.DEF(DEF));
  121.         //print("base kb: " + knockback + ", dir: " + direction.normalized + "\n knb: " + KnockCalc(knockback, timst.DEF(DEF)) + ", total: " + knk + ", delay: " + knockDelayCalc());
  122.  
  123.         if(knockDelayCalc() != 0)
  124.         {
  125.             rb.AddForce(knk, ForceMode2D.Impulse);
  126.             print(rb.angularVelocity);
  127.         }
  128.  
  129.         yield return new WaitForSeconds(knockDelayCalc());
  130.  
  131.         pl_input.enabled = true;
  132.         pl_mvt.can_move = true;
  133.         knocked = null;
  134.     }
  135.  
  136.     float knockDelayCalc()
  137.     {
  138.         float knk = knockDelay;
  139.         float def = timst.DEF(DEF)/33;
  140.  
  141.         if(knk - def < 0) return 0;
  142.         return knk - def;
  143.     }
  144.  
  145.     float KnockCalc(float knockback, int def)
  146.     {
  147.         float modifier = def - 33;
  148.         if(modifier < 1) modifier = 0;
  149.  
  150.         return (knockback - modifier < 0)? 0 : knockback - modifier;
  151.     }
  152.  
  153.     IEnumerator invCoroutine()
  154.     {
  155.         Color cola = spre.color;
  156.         Color colb = cola;
  157.         colb.a = 0.5f;
  158.  
  159.         spre.color = colb;
  160.         yield return new WaitForSeconds(invTimer);
  161.         spre.color = cola;
  162.  
  163.         invCor = null;
  164.     }
  165.  
  166.  
  167.     int CalcDmg(int dmg)
  168.     {
  169.         int def = player_stats.DEF();
  170.         if(def < 0) def = 0;
  171.  
  172.         float DMG = dmg - def * 0.75f;
  173.         if(DMG < 1) DMG = 1;
  174.  
  175.         return (int)DMG;
  176.     }
  177.  
  178.     public void ChangeAudio(AudioClip[] newhurt)
  179.     {
  180.         hurtSounds = newhurt;
  181.     }
  182.  
  183. }
  184.  
Add Comment
Please, Sign In to add comment