Skip to content

Commit cedd226

Browse files
committed
Better health implementation.
1 parent 9fc40d2 commit cedd226

File tree

6 files changed

+68
-8
lines changed

6 files changed

+68
-8
lines changed

src/api/java/io/izzel/mesmerize/api/DefaultStats.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ public final class DefaultStats {
5353
public static final Stats<StatsNumber<Double>> ACCELERATE = singleRelativeStats("accelerate", true);
5454
public static final Stats<List<StatsSetValue>> STATS_SET = StatsSetValue.STATS;
5555
public static final Stats<Map<String, StatsValue<?>>> SLOT = SlotStats.STATS;
56+
public static final Stats<List<StatsSetValue>> HIDDEN_SET = StatsSetValue.HIDDEN;
5657

5758
@SuppressWarnings("deprecation")
5859
private static NamespacedKey key(String id) {

src/api/java/io/izzel/mesmerize/api/data/complex/StatsSetValue.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,4 +98,10 @@ public static BiFunction<StatsSetValue, StatsSetValue, StatsSetValue> defaultMer
9898
.supplying(MultiValue.builder().supplying(StatsSetValue::new).allowSingleNonListValue().buildSupplier())
9999
.merging(MultiValue.concatMerger())
100100
.displaying((value, pane) -> value.get().forEach(it -> ElementFactory.instance().displayHolder(it.get(), pane))).build();
101+
102+
@SuppressWarnings("deprecation")
103+
public static final Stats<List<StatsSetValue>> HIDDEN =
104+
Stats.builder().key(new NamespacedKey("mesmerize", "hidden"))
105+
.supplying(MultiValue.builder().supplying(StatsSetValue::new).allowSingleNonListValue().buildSupplier())
106+
.merging(MultiValue.concatMerger()).build();
101107
}

src/api/java/io/izzel/mesmerize/api/data/stats/SlotStats.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,19 @@
22

33
import com.google.common.collect.Lists;
44
import io.izzel.mesmerize.api.Stats;
5+
import io.izzel.mesmerize.api.cause.ContextKeys;
56
import io.izzel.mesmerize.api.data.MapValue;
67
import io.izzel.mesmerize.api.data.MultiValue;
7-
import io.izzel.mesmerize.api.data.complex.StatsSetValue;
88
import io.izzel.mesmerize.api.data.StringValue;
9+
import io.izzel.mesmerize.api.data.complex.StatsSetValue;
910
import io.izzel.mesmerize.api.display.DisplayPane;
1011
import io.izzel.mesmerize.api.display.Element;
1112
import io.izzel.mesmerize.api.service.ElementFactory;
13+
import io.izzel.mesmerize.api.slot.StatsSlot;
1214
import io.izzel.mesmerize.api.visitor.StatsHolder;
1315
import io.izzel.mesmerize.api.visitor.StatsValue;
16+
import io.izzel.mesmerize.api.visitor.ValueVisitor;
17+
import io.izzel.mesmerize.api.visitor.VisitMode;
1418
import org.bukkit.NamespacedKey;
1519

1620
import java.util.List;
@@ -24,7 +28,7 @@ public SlotStats(Map<String, Supplier<StatsValue<?>>> dataTypes) {
2428
}
2529

2630
public List<String> getSlots() {
27-
MultiValue<String, StringValue> value = this.get("node");
31+
MultiValue<String, StringValue> value = this.get("slot");
2832
return Lists.transform(value.get(), StringValue::get);
2933
}
3034

@@ -33,6 +37,32 @@ public StatsHolder getStats() {
3337
return statsSetValue.get();
3438
}
3539

40+
@Override
41+
public void accept(ValueVisitor visitor, VisitMode mode) {
42+
if (mode == VisitMode.VALUE) {
43+
List<StatsSlot> list = visitor.context().get(ContextKeys.SLOT);
44+
List<String> restrictions = this.getSlots();
45+
boolean found = false;
46+
for (StatsSlot slot : list) {
47+
for (String restriction : restrictions) {
48+
if (restriction.equals(slot.getId())) {
49+
found = true;
50+
break;
51+
}
52+
}
53+
if (found) break;
54+
}
55+
if (found) {
56+
this.getStats().accept(visitor.visitStats(), mode);
57+
} else {
58+
visitor.visitStats().visitEnd();
59+
}
60+
visitor.visitEnd();
61+
} else {
62+
super.accept(visitor, mode);
63+
}
64+
}
65+
3666
@SuppressWarnings("deprecation")
3767
public static final Stats<Map<String, StatsValue<?>>> STATS =
3868
Stats.builder()

src/main/java/io/izzel/mesmerize/impl/command/MesmerizeCommand.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import org.bukkit.command.Command;
2222
import org.bukkit.command.CommandSender;
2323
import org.bukkit.entity.Player;
24+
import org.bukkit.inventory.EntityEquipment;
2425
import org.bukkit.inventory.ItemStack;
2526
import org.bukkit.inventory.meta.ItemMeta;
2627

@@ -35,6 +36,16 @@ public void reload(CommandSender sender, String... args) {
3536
TLocale.sendTo(sender, "command.reload");
3637
}
3738

39+
@SubCommand(permission = "mesmerize.refresh", type = CommandType.PLAYER)
40+
public void refresh(Player player, String... args) {
41+
EntityEquipment equipment = player.getEquipment();
42+
if (equipment != null) {
43+
ItemStack itemInMainHand = equipment.getItemInMainHand();
44+
ElementFactory.instance().updateLore(itemInMainHand);
45+
equipment.setItemInMainHand(itemInMainHand);
46+
}
47+
}
48+
3849
@SubCommand(permission = "mesmerize.attach", type = CommandType.PLAYER)
3950
public BaseSubCommand attach = new BaseSubCommand() {
4051

src/main/java/io/izzel/mesmerize/impl/event/AttributeListener.java

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import org.bukkit.Bukkit;
1414
import org.bukkit.attribute.Attribute;
1515
import org.bukkit.attribute.AttributeInstance;
16+
import org.bukkit.attribute.AttributeModifier;
1617
import org.bukkit.entity.Entity;
1718
import org.bukkit.entity.LivingEntity;
1819
import org.bukkit.entity.Player;
@@ -34,6 +35,7 @@ public AttributeListener() {
3435
return;
3536
}
3637
for (Player player : Bukkit.getOnlinePlayers()) {
38+
if (player.isDead() || !player.isValid()) continue;
3739
Optional<List<NumberValue<Double>>> regen = DefaultStats.REGENERATION.tryApply(StatsSet.of(player), null);
3840
regen.ifPresent(list -> {
3941
//noinspection ConstantConditions
@@ -55,6 +57,8 @@ public void onJoin(PlayerJoinEvent event) {
5557
} else {
5658
event.getPlayer().setHealthScaled(false);
5759
}
60+
//noinspection deprecation
61+
event.getPlayer().setMaxHealth(health.defaultHealth());
5862
}
5963
}
6064

@@ -69,10 +73,18 @@ public void onRefresh(StatsRefreshEvent event) {
6973
AttributeInstance attribute = livingEntity.getAttribute(Attribute.GENERIC_MAX_HEALTH);
7074
if (attribute != null) {
7175
HealthSpec healthSpec = ConfigSpec.spec().health();
72-
attribute.setBaseValue(DefaultStats.HEALTH.tryApply(statsSet, event).map(number -> {
73-
double value = number.applyDouble(healthSpec.defaultHealth());
76+
for (AttributeModifier modifier : attribute.getModifiers()) {
77+
if (modifier.getName().equals("mesmerize:health")) {
78+
attribute.removeModifier(modifier);
79+
}
80+
}
81+
double baseHealth = attribute.getValue();
82+
double healthModifier = DefaultStats.HEALTH.tryApply(statsSet, event).map(number -> {
83+
double value = number.applyDouble(baseHealth);
7484
return Util.clamp(value, healthSpec.minimalHealth(), healthSpec.maximumHealth());
75-
}).orElse(healthSpec.defaultHealth()));
85+
}).orElse(baseHealth) - baseHealth;
86+
attribute.addModifier(new AttributeModifier("mesmerize:health", healthModifier, AttributeModifier.Operation.ADD_NUMBER));
87+
livingEntity.setHealth(Util.clamp(livingEntity.getHealth(), 0, baseHealth + healthModifier));
7688
}
7789
}
7890

src/main/java/io/izzel/mesmerize/impl/service/SimpleStatsService.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,10 @@ public class SimpleStatsService implements StatsService {
4848
private final Set<Integer> entityLock = Collections.newSetFromMap(new ConcurrentHashMap<>());
4949

5050
private final CacheLoader<Entity, StatsSet> cacheLoader = entity -> {
51-
if (!entity.isValid() || entity.isDead()) {
52-
return null;
53-
}
5451
Callable<StatsSet> callable = () -> {
52+
if (!entity.isValid() || entity.isDead()) {
53+
return null;
54+
}
5555
StatsSet statsSet = new StatsSet();
5656
newEntityReader(entity).accept(statsSet, VisitMode.VALUE);
5757
Bukkit.getPluginManager().callEvent(new StatsRefreshEvent(entity, statsSet));

0 commit comments

Comments
 (0)