Skip to content

Commit 4608917

Browse files
committed
procreatewith playerv1.0
1 parent 9b8a0a8 commit 4608917

File tree

4 files changed

+130
-2
lines changed

4 files changed

+130
-2
lines changed

core/src/main/java/me/matsubara/realisticvillagers/RealisticVillagers.java

+2
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import me.matsubara.realisticvillagers.manager.revive.ReviveManager;
2727
import me.matsubara.realisticvillagers.nms.INMSConverter;
2828
import me.matsubara.realisticvillagers.tracker.VillagerTracker;
29+
import me.matsubara.realisticvillagers.entity.PlayerProcreationTracker;
2930
import me.matsubara.realisticvillagers.util.*;
3031
import me.matsubara.realisticvillagers.util.customblockdata.CustomBlockData;
3132
import net.wesjd.anvilgui.AnvilGUI;
@@ -100,6 +101,7 @@ public final class RealisticVillagers extends JavaPlugin {
100101
private VillagerListeners villagerListeners;
101102
private MarriageListener marriageListener;
102103

104+
private PlayerProcreationTracker playerProcreationTracker;
103105
private VillagerTracker tracker;
104106
private @Setter Shape ring;
105107
private @Setter Shape whistle;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package me.matsubara.realisticvillagers.entity;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.UUID;
6+
7+
public class PlayerProcreationTracker {
8+
9+
// Stores player procreation times (player1 -> (player2 -> timestamp))
10+
private final Map<UUID, Map<UUID, Long>> procreationTimes = new HashMap<>();
11+
12+
public void setLastProcreation(UUID player1, UUID player2) {
13+
long currentTime = System.currentTimeMillis();
14+
15+
16+
procreationTimes.putIfAbsent(player1, new HashMap<>());
17+
procreationTimes.putIfAbsent(player2, new HashMap<>());
18+
19+
procreationTimes.get(player1).put(player2, currentTime);
20+
procreationTimes.get(player2).put(player1, currentTime);
21+
}
22+
23+
24+
public long getLastProcreation(UUID player1, UUID player2) {
25+
return procreationTimes.getOrDefault(player1, new HashMap<>()).getOrDefault(player2, 0L);
26+
}
27+
}

core/src/main/java/me/matsubara/realisticvillagers/listener/MarriageListener.java

+26-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
package me.matsubara.realisticvillagers.listener;
2+
import at.pcgamingfreaks.MarriageMaster.Bukkit.API.Events.KissEvent;
23
import at.pcgamingfreaks.MarriageMaster.Bukkit.API.MarriagePlayer;
4+
import me.matsubara.realisticvillagers.files.Config;
5+
import me.matsubara.realisticvillagers.task.BabyTaskPlayer;
6+
import me.matsubara.realisticvillagers.util.PluginUtils;
37
import org.bukkit.Bukkit;
48
import org.bukkit.entity.Player;
59
import at.pcgamingfreaks.MarriageMaster.Bukkit.API.MarriageMasterPlugin;
@@ -13,9 +17,12 @@
1317
import org.bukkit.event.EventHandler;
1418
import org.bukkit.event.Listener;
1519
import org.bukkit.persistence.PersistentDataType;
16-
20+
import me.matsubara.realisticvillagers.entity.PlayerProcreationTracker;
1721
import java.util.UUID;
1822

23+
import static com.sun.org.apache.xml.internal.serializer.utils.Utils.messages;
24+
25+
1926
public class MarriageListener implements Listener {
2027
private final RealisticVillagers plugin;
2128

@@ -28,7 +35,6 @@ public MarriageListener(RealisticVillagers plugin) {
2835

2936
@EventHandler
3037
private void ForceDivorcewhenmarried(MarriedEvent event) {
31-
MarriageMasterPlugin marriageMasterPlugin = (MarriageMasterPlugin) Bukkit.getPluginManager().getPlugin("MarriageMaster");
3238
Messages messages = plugin.getMessages();
3339
VillagerTracker tracker = plugin.getTracker();
3440
INMSConverter converter = plugin.getConverter();
@@ -78,4 +84,22 @@ private void ForceDivorcewhenmarried(MarriedEvent event) {
7884
break;
7985
}
8086
}
87+
88+
@EventHandler
89+
private void KidWhenKissing(KissEvent event) {
90+
MarriagePlayer kisser = event.getPlayer();
91+
MarriagePlayer partner = event.getPlayer().getPartner();
92+
93+
Player kisserplayer = kisser.getPlayerOnline();
94+
Player partnerplayer = partner.getPlayerOnline();
95+
96+
UUID player1UUID = kisserplayer.getUniqueId();
97+
UUID player2UUID = partnerplayer.getUniqueId();
98+
99+
100+
101+
new BabyTaskPlayer(plugin, partnerplayer, kisserplayer).runTaskTimer(plugin, 0L, 20L);
102+
103+
104+
}
81105
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package me.matsubara.realisticvillagers.task;
2+
3+
import me.matsubara.realisticvillagers.RealisticVillagers;
4+
import me.matsubara.realisticvillagers.entity.IVillagerNPC;
5+
import me.matsubara.realisticvillagers.files.Config;
6+
import net.wesjd.anvilgui.AnvilGUI;
7+
import org.apache.commons.lang3.RandomUtils;
8+
import org.bukkit.Material;
9+
import org.bukkit.Particle;
10+
import org.bukkit.entity.Player;
11+
import org.bukkit.entity.Villager;
12+
import org.bukkit.inventory.ItemStack;
13+
import org.bukkit.scheduler.BukkitRunnable;
14+
import org.jetbrains.annotations.NotNull;
15+
16+
import java.util.Collections;
17+
18+
public class BabyTaskPlayer extends BukkitRunnable {
19+
20+
private final RealisticVillagers plugin;
21+
private final Player partner;
22+
private final Player player;
23+
private final boolean isBoy;
24+
25+
private int count = 0;
26+
private boolean success = false;
27+
28+
@SuppressWarnings("OptionalGetWithoutIsPresent")
29+
public BabyTaskPlayer(@NotNull RealisticVillagers plugin, Player partner, Player player) {
30+
this.plugin = plugin;
31+
// No need to check if it's invalid, the main GUI can only be opened by valid villagers.
32+
this.partner = partner;
33+
this.player = player;
34+
this.isBoy = RandomUtils.nextBoolean();
35+
}
36+
37+
@Override
38+
public void run() {
39+
if (++count == 10) {
40+
openInventory(Config.BABY_TEXT.asStringTranslated());
41+
cancel();
42+
return;
43+
}
44+
45+
46+
player.spawnParticle(Particle.HEART, partner.getEyeLocation(), 3, 0.1d, 0.1d, 0.1d);
47+
}
48+
49+
private void openInventory(String text) {
50+
new AnvilGUI.Builder()
51+
.title(Config.BABY_TITLE.asStringTranslated().replace("%sex%", isBoy ? Config.BOY.asString() : Config.GIRL.asString()))
52+
.text(text)
53+
.itemLeft(new ItemStack(Material.PAPER))
54+
.onClick((slot, snapshot) -> {
55+
if (slot != AnvilGUI.Slot.OUTPUT) return Collections.emptyList();
56+
57+
String result = snapshot.getText();
58+
59+
if (result.length() < 3) return RealisticVillagers.CLOSE_RESPONSE;
60+
61+
long procreation = System.currentTimeMillis();
62+
player.getInventory().addItem(plugin.createBaby(isBoy, result, procreation, partner.getUniqueId()));
63+
64+
success = true;
65+
return RealisticVillagers.CLOSE_RESPONSE;
66+
})
67+
.onClose(opener -> {
68+
if (success) return;
69+
plugin.getServer().getScheduler().runTask(plugin, () -> openInventory(Config.BABY_INVALID_NAME.asStringTranslated()));
70+
})
71+
.plugin(plugin)
72+
.open(player)
73+
.getInventory();
74+
}
75+
}

0 commit comments

Comments
 (0)