Skip to content

Commit a9751c6

Browse files
authored
Add breeding timer support + missing survival features (#49)
1 parent 88275cc commit a9751c6

File tree

3 files changed

+150
-0
lines changed

3 files changed

+150
-0
lines changed

bukkit-common/src/main/java/net/badlion/bukkitapi/listener/PlayerListener.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
package net.badlion.bukkitapi.listener;
22

33
import net.badlion.bukkitapi.AbstractBukkitBadlionPlugin;
4+
import net.badlion.bukkitapi.survival.BreedingTracker;
45
import net.badlion.bukkitapi.timers.TimerApi;
56
import net.badlion.modapicommon.AbstractBadlionApi;
67
import org.bukkit.Bukkit;
8+
import org.bukkit.entity.Ageable;
9+
import org.bukkit.entity.Entity;
710
import org.bukkit.entity.Player;
811
import org.bukkit.event.EventHandler;
912
import org.bukkit.event.EventPriority;
1013
import org.bukkit.event.Listener;
14+
import org.bukkit.event.entity.EntityBreedEvent;
1115
import org.bukkit.event.player.PlayerChangedWorldEvent;
16+
import org.bukkit.event.player.PlayerInteractEntityEvent;
1217
import org.bukkit.event.player.PlayerJoinEvent;
1318
import org.bukkit.event.player.PlayerQuitEvent;
1419
import org.bukkit.event.player.PlayerRespawnEvent;
@@ -19,9 +24,11 @@
1924
public class PlayerListener implements Listener {
2025

2126
private final AbstractBukkitBadlionPlugin plugin;
27+
private final BreedingTracker breedingTracker;
2228

2329
public PlayerListener(AbstractBukkitBadlionPlugin plugin) {
2430
this.plugin = plugin;
31+
this.breedingTracker = new BreedingTracker(plugin);
2532
}
2633

2734
@EventHandler
@@ -41,6 +48,7 @@ public void onPlayerJoin(PlayerJoinEvent event) {
4148
this.plugin.getSurvivalManager().sendData(player);
4249

4350
Bukkit.getScheduler().runTaskLater(this.plugin, () -> this.plugin.getWaypointManager().sendWaypointsToClient(player, player.getWorld()), 40);
51+
this.breedingTracker.trackAll(event.getPlayer());
4452
}
4553

4654
@EventHandler
@@ -67,5 +75,25 @@ public void onRespawn(PlayerRespawnEvent event) {
6775
@EventHandler
6876
public void onJoinWorld(PlayerChangedWorldEvent event) {
6977
this.plugin.getSurvivalManager().sendData(event.getPlayer());
78+
this.breedingTracker.trackAll(event.getPlayer());
79+
}
80+
81+
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
82+
public void onBreed(EntityBreedEvent event) {
83+
if (!(event.getBreeder() instanceof Player)) {
84+
return;
85+
}
86+
87+
Bukkit.getScheduler().scheduleSyncDelayedTask(this.plugin, () ->
88+
this.breedingTracker.track((Player) event.getBreeder(), false, event.getMother(), event.getFather(), event.getEntity()), 1);
89+
}
90+
91+
@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
92+
public void onInteract(PlayerInteractEntityEvent event) {
93+
Entity entity = event.getRightClicked();
94+
95+
if (entity instanceof Ageable && ((Ageable) entity).getAge() != 0) {
96+
this.breedingTracker.track(event.getPlayer(), true, entity);
97+
}
7098
}
7199
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package net.badlion.bukkitapi.survival;
2+
3+
import com.google.common.cache.Cache;
4+
import com.google.common.cache.CacheBuilder;
5+
import com.google.gson.JsonArray;
6+
import com.google.gson.JsonObject;
7+
import net.badlion.bukkitapi.AbstractBukkitBadlionPlugin;
8+
import net.badlion.modapicommon.mods.ModType;
9+
import org.bukkit.entity.Ageable;
10+
import org.bukkit.entity.Entity;
11+
import org.bukkit.entity.Player;
12+
13+
import java.util.Objects;
14+
import java.util.UUID;
15+
import java.util.concurrent.TimeUnit;
16+
17+
public class BreedingTracker {
18+
19+
private static final Object NO_VALUE = new Object();
20+
21+
private final AbstractBukkitBadlionPlugin plugin;
22+
private final Cache<AgeCacheKey, Object> entityAgeSendCache = CacheBuilder.newBuilder().expireAfterWrite(30, TimeUnit.SECONDS).build();
23+
24+
public BreedingTracker(AbstractBukkitBadlionPlugin plugin) {
25+
this.plugin = plugin;
26+
}
27+
28+
public void track(Player player, boolean checkCache, Entity... entities) {
29+
JsonArray array = new JsonArray();
30+
31+
for (Entity entity : entities) {
32+
AgeCacheKey cacheKey = new AgeCacheKey(player.getUniqueId(), entity.getUniqueId());
33+
34+
if (checkCache && this.entityAgeSendCache.getIfPresent(cacheKey) != null) {
35+
continue;
36+
}
37+
38+
this.entityAgeSendCache.put(cacheKey, BreedingTracker.NO_VALUE);
39+
40+
JsonObject entityObject = new JsonObject();
41+
entityObject.addProperty("id", entity.getUniqueId().toString());
42+
entityObject.addProperty("age", ((Ageable) entity).getAge());
43+
array.add(entityObject);
44+
}
45+
46+
if (array.size() > 0) {
47+
JsonObject object = new JsonObject();
48+
object.addProperty("type", "breedingTracker");
49+
object.add("entities", array);
50+
this.plugin.getMessageSender().sendModData(player.getUniqueId(), ModType.SURVIVAL, object);
51+
}
52+
}
53+
54+
public void trackAll(Player player) {
55+
Entity[] entities = player.getWorld().getEntities().stream().filter(e -> e instanceof Ageable && ((Ageable) e).getAge() != 0).toArray(Entity[]::new);
56+
this.track(player, false, entities);
57+
}
58+
59+
private static class AgeCacheKey {
60+
private final UUID playerId;
61+
private final UUID entityId;
62+
63+
public AgeCacheKey(UUID playerId, UUID entityId) {
64+
this.playerId = playerId;
65+
this.entityId = entityId;
66+
}
67+
68+
@Override
69+
public boolean equals(Object o) {
70+
if (this == o) {
71+
return true;
72+
}
73+
74+
if (o == null || this.getClass() != o.getClass()) {
75+
return false;
76+
}
77+
78+
AgeCacheKey that = (AgeCacheKey) o;
79+
return Objects.equals(this.playerId, that.playerId) && Objects.equals(this.entityId, that.entityId);
80+
}
81+
82+
@Override
83+
public int hashCode() {
84+
return Objects.hash(this.playerId, this.entityId);
85+
}
86+
}
87+
}

modapi-common/src/main/java/net/badlion/modapicommon/survival/SurvivalFeature.java

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,41 @@ public enum SurvivalFeature {
4343
"ELDER_GUARDIAN_SPAWN_EGG",
4444
"Remove elder guardian effect",
4545
"..."
46+
),
47+
ANTI_STRIP_LOG(
48+
"OAK_LOG",
49+
"Anti strip log",
50+
"..."
51+
),
52+
DEATH_COUNTER(
53+
"REDSTONE",
54+
"Death counter",
55+
"..."
56+
),
57+
DEATH_FINDER(
58+
"COMPASS",
59+
"Death finder",
60+
"..."
61+
),
62+
TOOL_INFO(
63+
"IRON_PICKAXE",
64+
"Tool stats",
65+
"..."
66+
),
67+
INVENTORY_MOVE(
68+
"CRAFTING_TABLE",
69+
"Inventory move",
70+
"..."
71+
),
72+
BREEDING_TIMER(
73+
"CARROT",
74+
"Breeding Timer",
75+
"..."
76+
),
77+
INVENTORY_VIEWER(
78+
"CHEST",
79+
"Inventory Viewer",
80+
"..."
4681
);
4782

4883
private final String material;

0 commit comments

Comments
 (0)