1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
|
using System;
using Photon.Pun;
using UnityEngine;
using UnityEngine.Events;
public class DamagableEvent : Damagable
{
public bool networkedDamage;
public bool disabled;
[HideInInspector]
public bool dead;
public float currentHP = 100f;
public float regenDelay = 1f;
public float regenPerSecond;
[HideInInspector]
public float maxHP = 100f;
public UnityEvent damageEvent;
public UnityEvent deathEvent;
private float sinceDamage = 1f;
[HideInInspector]
public Player lastPlayer;
[HideInInspector]
public GameObject lastWeapon;
private PhotonView view;
public Action<Vector2> DieAction;
private void Start()
{
view = GetComponent<PhotonView>();
maxHP = currentHP;
}
public override void TakeDamage(Vector2 damage, Vector2 damagePosition, GameObject damagingWeapon = null, Player damagingPlayer = null, bool lethal = true, bool ignoreBlock = false)
{
if (disabled || dead)
{
return;
}
if (networkedDamage)
{
if ((bool)damagingPlayer)
{
if (!damagingPlayer.data.view.IsMine)
{
return;
}
view.RPC("RPCA_TakeDamage", RpcTarget.Others, damage, damagePosition);
}
else
{
if (!view.IsMine)
{
return;
}
view.RPC("RPCA_TakeDamage", RpcTarget.Others, damage, damagePosition);
}
}
DoDamage(damage, damagePosition, damagingWeapon, damagingPlayer, lethal, ignoreBlock);
}
[PunRPC]
public void RPCA_TakeDamage(Vector2 damage, Vector2 damagePosition)
{
DoDamage(damage, damagePosition);
}
private void DoDamage(Vector2 damage, Vector2 damagePosition, GameObject damagingWeapon = null, Player damagingPlayer = null, bool lethal = true, bool ignoreBlock = false)
{
if ((bool)damagingPlayer)
{
lastPlayer = damagingPlayer;
}
if ((bool)damagingWeapon)
{
lastWeapon = damagingWeapon;
}
sinceDamage = 0f;
currentHP -= damage.magnitude;
if (currentHP <= 0f)
{
Die(damage);
}
else
{
damageEvent.Invoke();
}
}
private void Die(Vector2 damage = default(Vector2))
{
if (!dead && !disabled)
{
DieAction?.Invoke(damage);
deathEvent.Invoke();
dead = true;
}
}
private void Update()
{
if (!dead && !disabled)
{
sinceDamage += TimeHandler.deltaTime;
if (sinceDamage > regenDelay && currentHP < maxHP)
{
currentHP += regenPerSecond * TimeHandler.deltaTime;
currentHP = Mathf.Clamp(currentHP, float.NegativeInfinity, maxHP);
}
}
}
public override void TakeDamage(Vector2 damage, Vector2 damagePosition, Color dmgColor, GameObject damagingWeapon = null, Player damagingPlayer = null, bool lethal = true, bool ignoreBlock = false)
{
TakeDamage(damage, damagePosition, damagingWeapon, damagingPlayer, lethal);
}
public override void CallTakeDamage(Vector2 damage, Vector2 damagePosition, GameObject damagingWeapon = null, Player damagingPlayer = null, bool lethal = true)
{
TakeDamage(damage, damagePosition, Color.red, damagingWeapon, damagingPlayer, lethal);
}
}
|