-
Notifications
You must be signed in to change notification settings - Fork 1
/
AttackPlayerWhenAggressive.cs
134 lines (99 loc) · 3.02 KB
/
AttackPlayerWhenAggressive.cs
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 UnityEngine;
using Straitjacket.Harmony;
namespace NewSubnautica
{
[RequireComponent(typeof(SwimBehaviour))]
public class AttackPlayerWhenAggressive : CreatureAction
{
public float aggressionThreshold = 0.75f;
public float swimVelocity = 10f;
public float swimInterval = 0.8f;
public float minAttackDuration = 3f;
public float maxAttackDuration = 7f;
public float pauseInterval = 20f;
public bool resetAggressionOnTime = true;
public FMOD_CustomEmitter attackStartSound;
public VFXController attackStartFXcontrol;
private float timeStartAttack;
private float timeStopAttack;
private float timeNextSwim;
public void copyAttackLastTarget(AttackLastTarget a)
{
aggressionThreshold = a.aggressionThreshold;
swimVelocity = a.swimVelocity;
swimInterval = a.swimInterval;
minAttackDuration = a.minAttackDuration;
maxAttackDuration = a.maxAttackDuration;
pauseInterval = a.pauseInterval;
resetAggressionOnTime = a.resetAggressionOnTime;
attackStartSound = a.attackStartSound;
attackStartFXcontrol = a.attackStartFXcontrol;
}
public override float Evaluate(Creature creature)
{
if ((creature.Aggression.Value > this.aggressionThreshold | Time.time < this.timeStartAttack + this.minAttackDuration) & Time.time > this.timeStopAttack + this.pauseInterval)
{
var p = Player.main;
if (p != null && p.CanBeAttacked())
{
return creature.Aggression.Value;
}
}
return 0f;
}
public override void StartPerform(Creature creature)
{
this.timeStartAttack = Time.time;
if (this.attackStartSound)
{
this.attackStartSound.Play();
Debugger.Log("Play sound !");
}
if (this.attackStartFXcontrol != null)
{
this.attackStartFXcontrol.Play();
}
SafeAnimator.SetBool(creature.GetAnimator(), "attacking", true);
}
public override void Perform(Creature creature, float deltaTime)
{
//Debugger.Log("attack prio : " + prio);
ProfilingUtils.BeginSample("CreatureAction::Perform (AttackEcoTarget)");
if (Time.time > this.timeNextSwim)
{
this.timeNextSwim = Time.time + this.swimInterval;
Vector3 position = Player.main.transform.position;
Vector3 targetDirection = -MainCamera.camera.transform.forward;
base.swimBehaviour.Attack(position, targetDirection, this.swimVelocity);
}
if (this.resetAggressionOnTime && Time.time > this.timeStartAttack + this.maxAttackDuration)
{
this.StopAttack();
}
ProfilingUtils.EndSample(null);
}
public override void StopPerform(Creature creature)
{
SafeAnimator.SetBool(creature.GetAnimator(), "attacking", false);
if (this.attackStartFXcontrol != null)
{
this.attackStartFXcontrol.Stop();
}
this.timeStopAttack = Time.time;
}
protected virtual void StopAttack()
{
this.creature.Aggression.Value = 0f;
this.timeStopAttack = Time.time;
if (this.attackStartFXcontrol != null)
{
this.attackStartFXcontrol.Stop();
}
}
public void OnMeleeAttack(GameObject target)
{
this.StopAttack();
}
}
}