3
3
import io .izzel .mesmerize .api .DefaultStats ;
4
4
import io .izzel .mesmerize .api .data .NumberValue ;
5
5
import io .izzel .mesmerize .api .data .RangeNumberValue ;
6
- import io .izzel .mesmerize .api .data .StatsNumber ;
7
6
import io .izzel .mesmerize .api .event .StatsRefreshEvent ;
8
7
import io .izzel .mesmerize .api .visitor .util .StatsSet ;
9
8
import io .izzel .mesmerize .impl .Mesmerize ;
10
9
import io .izzel .mesmerize .impl .config .spec .ConfigSpec ;
10
+ import io .izzel .mesmerize .impl .config .spec .GeneralSpec ;
11
+ import io .izzel .mesmerize .impl .config .spec .HealthSpec ;
12
+ import io .izzel .mesmerize .impl .util .Util ;
11
13
import org .bukkit .Bukkit ;
12
14
import org .bukkit .attribute .Attribute ;
13
15
import org .bukkit .attribute .AttributeInstance ;
16
18
import org .bukkit .entity .Player ;
17
19
import org .bukkit .event .EventHandler ;
18
20
import org .bukkit .event .Listener ;
21
+ import org .bukkit .event .player .PlayerJoinEvent ;
19
22
20
23
import java .util .List ;
21
24
import java .util .Optional ;
@@ -27,40 +30,83 @@ public class AttributeListener implements Listener {
27
30
28
31
public AttributeListener () {
29
32
Bukkit .getScheduler ().runTaskTimer (Mesmerize .instance (), () -> {
33
+ if (!ConfigSpec .spec ().health ().enableHealthControl ()) {
34
+ return ;
35
+ }
30
36
for (Player player : Bukkit .getOnlinePlayers ()) {
31
37
Optional <List <NumberValue <Double >>> regen = DefaultStats .REGENERATION .tryApply (StatsSet .of (player ), null );
32
38
regen .ifPresent (list -> {
39
+ //noinspection ConstantConditions
40
+ double maxHealth = player .getAttribute (Attribute .GENERIC_MAX_HEALTH ).getValue ();
33
41
double heal = RangeNumberValue .applyAsDouble (0 , list , random );
34
- player .setHealth (player .getHealth () + heal );
42
+ player .setHealth (Util . clamp ( player .getHealth () + heal , 0 , maxHealth ) );
35
43
});
36
44
}
37
- }, 0 , ConfigSpec .spec ().general ().attributeApplyInterval ());
45
+ }, 0 , ConfigSpec .spec ().health ().regenerationTicks ());
46
+ }
47
+
48
+ @ EventHandler
49
+ public void onJoin (PlayerJoinEvent event ) {
50
+ HealthSpec health = ConfigSpec .spec ().health ();
51
+ if (health .enableHealthControl ()) {
52
+ if (health .healthScaled ()) {
53
+ event .getPlayer ().setHealthScaled (true );
54
+ event .getPlayer ().setHealthScale (health .heathScale ());
55
+ } else {
56
+ event .getPlayer ().setHealthScaled (false );
57
+ }
58
+ }
38
59
}
39
60
40
61
@ EventHandler
41
62
public void onRefresh (StatsRefreshEvent event ) {
42
63
Entity entity = event .getEntity ();
43
64
if (entity instanceof LivingEntity ) {
65
+ LivingEntity livingEntity = (LivingEntity ) entity ;
44
66
StatsSet statsSet = event .getStatsSet ();
45
- AttributeInstance attribute = ((LivingEntity ) entity ).getAttribute (Attribute .GENERIC_MAX_HEALTH );
46
- if (attribute != null ) {
47
- Optional <StatsNumber <Double >> health = DefaultStats .HEALTH .tryApply (statsSet , event );
48
- health .ifPresent (number -> attribute .setBaseValue (number .applyDouble (ConfigSpec .spec ().general ().defaultHealth ())));
49
- }
50
- AttributeInstance attackSpeedAttr = ((LivingEntity ) entity ).getAttribute (Attribute .GENERIC_ATTACK_SPEED );
51
- if (attackSpeedAttr != null ) {
52
- Optional <StatsNumber <Double >> attackSpeed = DefaultStats .ATTACK_SPEED .tryApply (statsSet , event );
53
- attackSpeed .ifPresent (number -> attackSpeedAttr .setBaseValue (number .applyDouble (ConfigSpec .spec ().general ().defaultAttackSpeed ())));
54
- }
55
- AttributeInstance moveSpeedAttr = ((LivingEntity ) entity ).getAttribute (Attribute .GENERIC_MOVEMENT_SPEED );
56
- if (moveSpeedAttr != null ) {
57
- Optional <StatsNumber <Double >> moveSpeed = DefaultStats .MOVE_SPEED .tryApply (statsSet , event );
58
- moveSpeed .ifPresent (number -> moveSpeedAttr .setBaseValue (number .applyDouble (ConfigSpec .spec ().general ().defaultMoveSpeed ())));
67
+
68
+ if (ConfigSpec .spec ().health ().enableHealthControl ()) {
69
+ AttributeInstance attribute = livingEntity .getAttribute (Attribute .GENERIC_MAX_HEALTH );
70
+ if (attribute != null ) {
71
+ HealthSpec healthSpec = ConfigSpec .spec ().health ();
72
+ attribute .setBaseValue (DefaultStats .HEALTH .tryApply (statsSet , event ).map (number -> {
73
+ double value = number .applyDouble (healthSpec .defaultHealth ());
74
+ return Util .clamp (value , healthSpec .minimalHealth (), healthSpec .maximumHealth ());
75
+ }).orElse (healthSpec .defaultHealth ()));
76
+ }
59
77
}
60
- AttributeInstance flySpeedAttr = ((LivingEntity ) entity ).getAttribute (Attribute .GENERIC_FLYING_SPEED );
61
- if (flySpeedAttr != null ) {
62
- Optional <StatsNumber <Double >> flySpeed = DefaultStats .FLY_SPEED .tryApply (statsSet , event );
63
- flySpeed .ifPresent (number -> flySpeedAttr .setBaseValue (number .applyDouble (ConfigSpec .spec ().general ().defaultFlySpeed ())));
78
+
79
+ GeneralSpec generalSpec = ConfigSpec .spec ().general ();
80
+ if (generalSpec .enableSpeedControl ()) {
81
+ AttributeInstance attackSpeedAttr = livingEntity .getAttribute (Attribute .GENERIC_ATTACK_SPEED );
82
+ if (attackSpeedAttr != null ) {
83
+ attackSpeedAttr .setBaseValue (DefaultStats .ATTACK_SPEED .tryApply (statsSet , event )
84
+ .map (number -> number .applyDouble (generalSpec .defaultAttackSpeed ()))
85
+ .orElse (generalSpec .defaultAttackSpeed ()));
86
+ }
87
+
88
+ double moveSpeed = DefaultStats .MOVE_SPEED .tryApply (statsSet , event ).map (number -> {
89
+ double value = number .applyDouble (generalSpec .defaultMoveSpeed ());
90
+ return Util .clamp (value , -1 , 1 );
91
+ }).orElse (generalSpec .defaultMoveSpeed ());
92
+ double flySpeed = DefaultStats .FLY_SPEED .tryApply (statsSet , event ).map (number -> {
93
+ double value = number .applyDouble (generalSpec .defaultFlySpeed ());
94
+ return Util .clamp (value , -1 , 1 );
95
+ }).orElse (generalSpec .defaultFlySpeed ());
96
+ if (entity instanceof Player ) {
97
+ Player player = (Player ) entity ;
98
+ player .setWalkSpeed ((float ) moveSpeed );
99
+ player .setFlySpeed ((float ) flySpeed );
100
+ } else {
101
+ AttributeInstance moveSpeedAttr = ((LivingEntity ) entity ).getAttribute (Attribute .GENERIC_MOVEMENT_SPEED );
102
+ if (moveSpeedAttr != null ) {
103
+ moveSpeedAttr .setBaseValue (moveSpeed );
104
+ }
105
+ AttributeInstance flySpeedAttr = ((LivingEntity ) entity ).getAttribute (Attribute .GENERIC_FLYING_SPEED );
106
+ if (flySpeedAttr != null ) {
107
+ flySpeedAttr .setBaseValue (flySpeed );
108
+ }
109
+ }
64
110
}
65
111
}
66
112
}
0 commit comments