1010import net .kyori .adventure .text .minimessage .MiniMessage ;
1111import net .kyori .adventure .text .minimessage .tag .resolver .Placeholder ;
1212import org .bukkit .Location ;
13+ import org .bukkit .entity .Ageable ;
1314import org .bukkit .entity .Player ;
1415import org .bukkit .entity .Villager ;
16+ import org .bukkit .entity .ZombieVillager ;
1517import org .bukkit .entity .memory .MemoryKey ;
1618import org .bukkit .event .EventHandler ;
1719import org .bukkit .event .EventPriority ;
2426
2527import java .util .ArrayList ;
2628import java .util .Arrays ;
27- import java .util .UUID ;
2829
2930public class VillagerHandler implements Listener {
3031
@@ -44,18 +45,30 @@ public void onVillagerClick(PlayerInteractEntityEvent event) {
4445 if (!event .getPlayer ().isSneaking ()) {
4546 return ;
4647 }
47- if (!(event .getRightClicked () instanceof Villager villager )) {
48- return ;
48+ if (event .getRightClicked () instanceof Villager villager ) {
49+ if (!player .hasPermission (Perms .USE .getPerm ())) {
50+ return ;
51+ }
52+ if (Arrays .stream (ToggleSetting .values ()).noneMatch (ToggleSetting ::isEnabled )) {
53+ VillagerInfo .getInstance ().getLogger ().warning ("You have all VillagerInfo options turned off. That seems silly, why do you have the plugin installed if you don't want to use it?" );
54+ return ;
55+ }
56+ event .setCancelled (true );
57+ processVillager (player , villager );
58+ } else if (event .getRightClicked () instanceof ZombieVillager zombieVillager ) {
59+ if (!player .hasPermission (Perms .USE .getPerm ())) {
60+ return ;
61+ }
62+ if (Arrays .stream (ToggleSetting .values ()).noneMatch (ToggleSetting ::isEnabled )) {
63+ VillagerInfo .getInstance ().getLogger ().warning ("You have all VillagerInfo options turned off. That seems silly, why do you have the plugin installed if you don't want to use it?" );
64+ return ;
65+ }
66+ event .setCancelled (true );
67+ processZombieVillager (player , zombieVillager );
4968 }
69+ }
5070
51- if (!player .hasPermission (Perms .USE .getPerm ())) {
52- return ;
53- }
54- if (Arrays .stream (ToggleSetting .values ()).noneMatch (ToggleSetting ::isEnabled )) {
55- VillagerInfo .getInstance ().getLogger ().warning ("You have all VillagerInfo options turned off. That seems silly, why do you have the plugin installed if you don't want to use it?" );
56- return ;
57- }
58- event .setCancelled (true );
71+ private void processVillager (Player player , Villager villager ) {
5972 Location villagerPOI = villager .getMemory (MemoryKey .JOB_SITE );
6073 ArrayList <Component > messageList = new ArrayList <>();
6174 boolean hasProfession = villager .getProfession () != Villager .Profession .NONE
@@ -65,11 +78,11 @@ public void onVillagerClick(PlayerInteractEntityEvent event) {
6578 boolean isAdult = villager .isAdult ();
6679 //time until adult
6780 if (ToggleSetting .BABY_AGE .isEnabled () && !isAdult ) {
68- messageList .add (villagerTimeTillAdult (villager ));
81+ messageList .add (timeTillAdult (villager ));
6982 }
7083 //profession
7184 if (ToggleSetting .PROFESSION .isEnabled () && isAdult ) {
72- messageList .add (villagerProfession (villager ));
85+ messageList .add (villagerProfession (villager . getProfession () ));
7386 }
7487 //job-site
7588 // Only show job site and last worked info if the villager has a profession
@@ -100,7 +113,7 @@ public void onVillagerClick(PlayerInteractEntityEvent event) {
100113 }
101114 //reputation
102115 if (ToggleSetting .REPUTATION .isEnabled ()) {
103- messageList .add (villagerPlayerReputation (villager , player ));
116+ messageList .add (villagerPlayerReputation (villager . getReputation ( player . getUniqueId ()) ));
104117 }
105118 if (ToggleSetting .HIGHLIGHT_WORKSTATION .isEnabled () && villagerPOI != null ) {
106119 HighlightHandling .villagerJobsiteHighlight (villager .getPersistentDataContainer (), villager .getUniqueId (), villagerPOI );
@@ -113,33 +126,55 @@ public void onVillagerClick(PlayerInteractEntityEvent event) {
113126 }
114127 }
115128
129+ private void processZombieVillager (Player player , ZombieVillager zombieVillager ) {
130+ ArrayList <Component > messageList = new ArrayList <>();
131+ boolean isAdult = zombieVillager .isAdult ();
132+ //time until adult
133+ if (ToggleSetting .BABY_AGE .isEnabled () && !isAdult ) {
134+ messageList .add (timeTillAdult (zombieVillager ));
135+ }
136+ //profession
137+ if (ToggleSetting .PROFESSION .isEnabled () && isAdult ) {
138+ messageList .add (villagerProfession (zombieVillager .getVillagerProfession ()));
139+ }
140+ //reputation
141+ // TODO: wait for Reputation API to be added for Zombie Villagers or use PDC to calculate reputation NBT by hand
142+ //if (ToggleSetting.REPUTATION.isEnabled()) {
143+ // messageList.add(villagerPlayerReputation(zombieVillager.getReputation(player.getUniqueId())));
144+ //}
145+ //Messages
146+ Component prefix = miniMessage .deserialize (Message .PREFIX .getMessage ());
147+ player .sendMessage (prefix );
148+ for (Component component : messageList ) {
149+ player .sendMessage (component );
150+ }
151+ }
152+
116153 /**
117154 * Checks and returns formatted 'time till adult' message component
118- * @param villager Clicked Villager
155+ * @param ageable Clicked Villager
119156 * @return Formatted Time Component
120157 */
121- private Component villagerTimeTillAdult ( Villager villager ) {
158+ private Component timeTillAdult ( Ageable ageable ) {
122159 Component timeTillAdultFinal ;
123- long villAge = villager .getAge ();
124- villAge = villAge * -1 ;
125- VillagerInfo .getInstance ().getLogger ().info ("" + villAge );
126- String timeCalc = timeMath (villAge );
160+ long age = ageable .getAge ();
161+ age = age * -1 ;
162+ String timeCalc = timeMath (age );
127163 timeTillAdultFinal = miniMessage .deserialize (Message .VILLAGER_AGE .getMessage (), Placeholder .unparsed ("age" , timeCalc ));
128164 return timeTillAdultFinal ;
129165 }
130166
131167 /**
132- * Checks and returns villager profession component
133- * @param villager Clicked Villager
168+ * Checks and returns profession component
169+ * @param profession profession
134170 * @return Profession Component
135171 */
136- private Component villagerProfession (Villager villager ) {
172+ private Component villagerProfession (Villager . Profession profession ) {
137173 Component professionFinal ;
138- String villagerProfessionString = villager .getProfession ().toString ();
139- if (villager .getProfession () == Villager .Profession .NONE ) {
174+ if (profession == Villager .Profession .NONE ) {
140175 professionFinal = miniMessage .deserialize (Message .VILLAGER_PROFESSION .getMessage (), Placeholder .parsed ("profession" , Message .NONE .getMessage ()));
141176 } else {
142- professionFinal = miniMessage .deserialize (Message .VILLAGER_PROFESSION .getMessage (), Placeholder .parsed ("profession" , villagerProfessionString ));
177+ professionFinal = miniMessage .deserialize (Message .VILLAGER_PROFESSION .getMessage (), Placeholder .parsed ("profession" , profession . toString () ));
143178 }
144179 return professionFinal ;
145180 }
@@ -269,13 +304,12 @@ private Component villagerRestocks(Villager villager) {
269304
270305 /**
271306 * Gets a player's reputation and returns a component
272- * @param villager Clicked Villager
273- * @param player Player to evaluate
307+ * @param reputation Reputation to evaluate
274308 * @return Reputation Component
275309 */
276- private Component villagerPlayerReputation (Villager villager , Player player ) {
310+ private Component villagerPlayerReputation (Reputation reputation ) {
277311 Component villagerReputationFinal ;
278- int reputationRawTotal = reputationTotal (villager , player . getUniqueId () );
312+ int reputationRawTotal = reputationTotal (reputation );
279313 String playerReputation = ReputationHandler .villagerReputation (reputationRawTotal );
280314 villagerReputationFinal = miniMessage .deserialize (Message .PLAYER_REPUTATION .getMessage (), Placeholder .unparsed ("reputation" , playerReputation ));
281315 return villagerReputationFinal ;
@@ -284,20 +318,18 @@ private Component villagerPlayerReputation(Villager villager, Player player) {
284318
285319 /**
286320 * Calculates the total reputation of a player, using all reputation types
287- * @param villager Clicked Villager
288- * @param player Player to evaluate
321+ * @param reputation reputation to calculate
289322 * @return Total reputation score
290323 */
291- private int reputationTotal (Villager villager , UUID player ) {
292- Reputation playerReputation = villager .getReputation (player );
293- if (playerReputation == null ) return 0 ;
294- int playerReputationMP = playerReputation .getReputation (ReputationType .MAJOR_POSITIVE );
295- int playerReputationP = playerReputation .getReputation (ReputationType .MINOR_POSITIVE );
296- int playerReputationMN = playerReputation .getReputation (ReputationType .MAJOR_NEGATIVE );
297- int playerReputationN = playerReputation .getReputation (ReputationType .MINOR_NEGATIVE );
298- int playerReputationT = playerReputation .getReputation (ReputationType .TRADING );
324+ private int reputationTotal (Reputation reputation ) {
325+ if (reputation == null ) return 0 ;
326+ int reputationMP = reputation .getReputation (ReputationType .MAJOR_POSITIVE );
327+ int reputationP = reputation .getReputation (ReputationType .MINOR_POSITIVE );
328+ int reputationMN = reputation .getReputation (ReputationType .MAJOR_NEGATIVE );
329+ int reputationN = reputation .getReputation (ReputationType .MINOR_NEGATIVE );
330+ int reputationT = reputation .getReputation (ReputationType .TRADING );
299331 //5MP+P+T-N-5MN = Total Reputation Score. Maxes at -700, 725
300- return (playerReputationMP * 5 ) + playerReputationP + playerReputationT - playerReputationN - (playerReputationMN * 5 );
332+ return (reputationMP * 5 ) + reputationP + reputationT - reputationN - (reputationMN * 5 );
301333 }
302334
303335 /**
0 commit comments