Skip to content

Commit 88f310c

Browse files
committed
Improved Heart displaying for entities
1 parent c1c91ad commit 88f310c

File tree

5 files changed

+184
-192
lines changed

5 files changed

+184
-192
lines changed

src/main/java/dev/lars/utilsmanager/UtilsManager.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.comphenix.protocol.ProtocolLibrary;
44
import com.comphenix.protocol.ProtocolManager;
55
import dev.lars.utilsmanager.entity.EntitySummons;
6+
import dev.lars.utilsmanager.entity.HeartDisplayManager;
67
import dev.lars.utilsmanager.features.backpack.BackpackManager;
78
import dev.lars.utilsmanager.features.court.CourtManager;
89
import dev.lars.utilsmanager.features.freecam.FreeCamManager;
@@ -35,6 +36,7 @@ public final class UtilsManager extends JavaPlugin {
3536
private TablistManager tablistManager;
3637
private RankManager rankManager;
3738
private EntitySummons entitySummons;
39+
private HeartDisplayManager heartDisplayManager;
3840
private QuestManager questManager;
3941
private BanManager banManager;
4042
private CourtManager courtManager;
@@ -77,6 +79,7 @@ private void initializeManagers() {
7779
new RealTime();
7880
new BedListener();
7981
entitySummons = new EntitySummons();
82+
heartDisplayManager = new HeartDisplayManager();
8083
courtManager = new CourtManager();
8184
banManager = new BanManager();
8285
new TeleporterListener();
@@ -102,7 +105,7 @@ private void initializeDiscordBot() {
102105

103106
private void registerGameFeatures() {
104107
new RecipeLoader().registerRecipes();
105-
entitySummons.EntityHearths();
108+
heartDisplayManager.start();
106109
rankManager.checkRanks();
107110
}
108111

src/main/java/dev/lars/utilsmanager/entity/EntitySummons.java

Lines changed: 1 addition & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -147,38 +147,6 @@ public void EntitysSummons() {
147147
wchicken3.customName(Component.text("Kjelli"));
148148
}
149149

150-
public void EntityHearths() {
151-
Bukkit.getScheduler().runTaskTimer(UtilsManager.getInstance(), bukkitTask -> {
152-
for (Player player : Bukkit.getOnlinePlayers()) {
153-
for (Entity entity : player.getNearbyEntities(20, 20, 20)) {
154-
if (!(entity instanceof Monster)) continue;
155-
156-
Monster monster = (Monster) entity;
157-
int healthInHearts = (int) Math.ceil(monster.getHealth() / 2);
158-
159-
String name = entity.customName() != null
160-
? PlainTextComponentSerializer.plainText().serialize(entity.customName())
161-
: null;
162-
163-
if (name == null || !name.contains("❤")) {
164-
entity.setCustomNameVisible(true);
165-
entity.customName(Component.text(healthInHearts + "❤"));
166-
} else {
167-
String displayedHealthString = name.replace("❤", "").trim();
168-
try {
169-
int displayedHealth = Integer.parseInt(displayedHealthString);
170-
if (displayedHealth != healthInHearts) {
171-
entity.customName(Component.text(healthInHearts + "❤"));
172-
}
173-
} catch (NumberFormatException e) {
174-
entity.customName(Component.text(healthInHearts + "❤"));
175-
}
176-
}
177-
}
178-
}
179-
}, 5, 5);
180-
}
181-
182150

183151
public void EntitysSummonsEnd() {
184152
/*s1sheep.remove();
@@ -211,4 +179,4 @@ public void EntitysSummonsEnd() {
211179

212180

213181
}
214-
}
182+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package dev.lars.utilsmanager.entity;
2+
3+
import dev.lars.utilsmanager.UtilsManager;
4+
import net.kyori.adventure.text.Component;
5+
import net.kyori.adventure.text.serializer.plain.PlainTextComponentSerializer;
6+
import org.bukkit.Bukkit;
7+
import org.bukkit.NamespacedKey;
8+
import org.bukkit.World;
9+
import org.bukkit.entity.Entity;
10+
import org.bukkit.entity.Monster;
11+
import org.bukkit.entity.Player;
12+
import org.bukkit.persistence.PersistentDataType;
13+
14+
public class HeartDisplayManager {
15+
16+
private static final int VIEW_RADIUS = 20;
17+
private static final long INITIAL_DELAY = 10L;
18+
private static final long INTERVAL = 10L;
19+
20+
private final NamespacedKey heartsKey;
21+
22+
public HeartDisplayManager() {
23+
this.heartsKey = new NamespacedKey(UtilsManager.getInstance(), "displayed_hearts");
24+
}
25+
26+
public void start() {
27+
Bukkit.getScheduler().runTaskTimer(UtilsManager.getInstance(), this::tick, INITIAL_DELAY, INTERVAL);
28+
}
29+
30+
private void tick() {
31+
PlainTextComponentSerializer plain = PlainTextComponentSerializer.plainText();
32+
33+
for (World world : Bukkit.getWorlds()) {
34+
for (Monster monster : world.getEntitiesByClass(Monster.class)) {
35+
36+
if (monster.isDead()) continue;
37+
38+
Component custom = monster.customName();
39+
String plainName = custom != null ? plain.serialize(custom) : null;
40+
boolean hasHeartLabel = plainName != null && plainName.contains("❤");
41+
42+
if (plainName != null && !hasHeartLabel) continue;
43+
44+
int hearts = (int) Math.ceil(monster.getHealth() / 2.0);
45+
46+
boolean playerNearby = monster.getNearbyEntities(VIEW_RADIUS, VIEW_RADIUS, VIEW_RADIUS)
47+
.stream().anyMatch(e -> e instanceof Player);
48+
49+
if (!playerNearby) {
50+
if (monster.getPersistentDataContainer().has(heartsKey, PersistentDataType.INTEGER)) {
51+
monster.setCustomNameVisible(false);
52+
}
53+
continue;
54+
}
55+
56+
int previous = -1;
57+
if (monster.getPersistentDataContainer().has(heartsKey, PersistentDataType.INTEGER)) {
58+
previous = monster.getPersistentDataContainer().get(heartsKey, PersistentDataType.INTEGER);
59+
}
60+
61+
if (previous != hearts || !hasHeartLabel) {
62+
monster.customName(Component.text(hearts + "❤"));
63+
monster.setCustomNameVisible(true);
64+
65+
monster.getPersistentDataContainer().set(heartsKey, PersistentDataType.INTEGER, hearts);
66+
}
67+
}
68+
}
69+
}
70+
}

0 commit comments

Comments
 (0)