forked from nisovin/MagicSpells
-
Notifications
You must be signed in to change notification settings - Fork 66
/
EmpowerSpell.java
108 lines (81 loc) · 2.82 KB
/
EmpowerSpell.java
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
package com.nisovin.magicspells.spells.buff;
import java.util.Map;
import java.util.UUID;
import java.util.HashMap;
import java.util.function.Supplier;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.entity.LivingEntity;
import com.nisovin.magicspells.util.*;
import com.nisovin.magicspells.spells.BuffSpell;
import com.nisovin.magicspells.events.SpellCastEvent;
import com.nisovin.magicspells.util.config.ConfigData;
public class EmpowerSpell extends BuffSpell {
private final Map<UUID, Supplier<Float>> entities;
private final ConfigData<Float> powerMultiplier;
private final ConfigData<Float> maxPowerMultiplier;
private final ConfigData<Boolean> constantMultiplier;
private final ConfigData<Boolean> powerAffectsMultiplier;
private SpellFilter filter;
public EmpowerSpell(MagicConfig config, String spellName) {
super(config, spellName);
powerMultiplier = getConfigDataFloat("power-multiplier", 1.5F);
maxPowerMultiplier = getConfigDataFloat("max-power-multiplier", 1.5F);
constantMultiplier = getConfigDataBoolean("constant-multiplier", true);
powerAffectsMultiplier = getConfigDataBoolean("power-affects-multiplier", true);
filter = getConfigSpellFilter();
entities = new HashMap<>();
}
@Override
public boolean castBuff(SpellData data) {
Supplier<Float> supplier;
if (constantMultiplier.get(data)) {
float multiplier = powerMultiplier.get(data);
if (powerAffectsMultiplier.get(data)) multiplier *= data.power();
multiplier = Math.min(multiplier, maxPowerMultiplier.get(data));
float finalMultiplier = multiplier;
supplier = () -> finalMultiplier;
} else {
supplier = () -> {
float multiplier = powerMultiplier.get(data);
if (powerAffectsMultiplier.get(data)) multiplier *= data.power();
return Math.min(multiplier, maxPowerMultiplier.get(data));
};
}
entities.put(data.target().getUniqueId(), supplier);
return true;
}
@Override
public boolean recastBuff(SpellData data) {
stopEffects(data.target());
return castBuff(data);
}
@Override
public boolean isActive(LivingEntity entity) {
return entities.containsKey(entity.getUniqueId());
}
@Override
public void turnOffBuff(LivingEntity entity) {
entities.remove(entity.getUniqueId());
}
@Override
protected void turnOff() {
entities.clear();
}
@EventHandler(priority = EventPriority.HIGHEST)
public void onSpellCast(SpellCastEvent event) {
LivingEntity caster = event.getCaster();
if (caster == null || !isActive(caster) || !filter.check(event.getSpell())) return;
event.increasePower(entities.get(caster.getUniqueId()).get());
addUseAndChargeCost(caster);
}
public Map<UUID, Supplier<Float>> getEntities() {
return entities;
}
public SpellFilter getFilter() {
return filter;
}
public void setFilter(SpellFilter filter) {
this.filter = filter;
}
}