diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java index 537d412b4f8..517f7055aa7 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitClasses.java @@ -44,6 +44,7 @@ import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason; import org.bukkit.event.entity.EntityTransformEvent.TransformReason; import org.bukkit.event.entity.EntityUnleashEvent; +import org.bukkit.event.entity.VillagerCareerChangeEvent; import org.bukkit.event.inventory.ClickType; import org.bukkit.event.inventory.InventoryAction; import org.bukkit.event.inventory.InventoryCloseEvent; @@ -1550,7 +1551,6 @@ public String toVariableNameString(WorldBorder border) { .changer(DefaultChangers.entityChanger) ); - Classes.registerClass(new EnumClassInfo<>(EquipmentSlot.class, "equipmentslot", "equipment slots") .user("equipment ?slots?") .name("Equipment Slot") @@ -1558,6 +1558,13 @@ public String toVariableNameString(WorldBorder border) { .since("2.11") ); + Classes.registerClass(new EnumClassInfo<>(VillagerCareerChangeEvent.ChangeReason.class, "villagercareerchangereason", "villager career change reasons") + .user("(villager )?career ?change ?reasons?") + .name("Villager Career Change Reason") + .description("Represents a reason why a villager changed its career.") + .since("INSERT VERSION") + ); + } } diff --git a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java index c1b20253cf1..23b80de9a16 100644 --- a/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java +++ b/src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java @@ -33,6 +33,7 @@ import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.entity.*; +import org.bukkit.entity.Villager.Profession; import org.bukkit.event.block.*; import org.bukkit.event.enchantment.EnchantItemEvent; import org.bukkit.event.enchantment.PrepareItemEnchantEvent; @@ -779,6 +780,23 @@ public void set(VaultDisplayItemEvent event, @Nullable ItemStack itemStack) { }); } + EventValues.registerEventValue(VillagerCareerChangeEvent.class, VillagerCareerChangeEvent.ChangeReason.class, VillagerCareerChangeEvent::getReason); + EventValues.registerEventValue(VillagerCareerChangeEvent.class, Villager.Profession.class, new EventConverter<>() { + @Override + public void set(VillagerCareerChangeEvent event, @Nullable Profession profession) { + if (profession == null) + return; + event.setProfession(profession); + } + + @Override + public Profession convert(VillagerCareerChangeEvent event) { + return event.getProfession(); + } + }); + EventValues.registerEventValue(VillagerCareerChangeEvent.class, Villager.Profession.class, + event -> event.getEntity().getProfession(), TIME_PAST); + } } diff --git a/src/main/java/ch/njol/skript/events/SimpleEvents.java b/src/main/java/ch/njol/skript/events/SimpleEvents.java index a6dbc1fdee6..2a4998dab2a 100644 --- a/src/main/java/ch/njol/skript/events/SimpleEvents.java +++ b/src/main/java/ch/njol/skript/events/SimpleEvents.java @@ -786,6 +786,20 @@ public class SimpleEvents { .since("INSERT VERSION") .requiredPlugins("Minecraft 1.21.1+"); } + + Skript.registerEvent("Villager Career Change", SimpleEvent.class, VillagerCareerChangeEvent.class, + "villager career chang(e[d]|ing)") + .description("Called when a villager changes its career. Can be caused by being employed or losing their job.") + .examples(""" + on villager career change: + if all: + event-career change reason is employment + event-villager profession is armorer profession + then: + cancel event + """) + .since("INSERT VERSION"); + } } diff --git a/src/main/resources/lang/default.lang b/src/main/resources/lang/default.lang index e4ee755af0a..8479837514e 100644 --- a/src/main/resources/lang/default.lang +++ b/src/main/resources/lang/default.lang @@ -2586,6 +2586,11 @@ equipment slots: off_hand: off hand slot, off hand body: body slot, body armor slot, body armour slot +# -- Villager Career Change Reasons +villager career change reasons: + employed: employment + losing_job: losing job + # -- Boolean -- boolean: true: @@ -2689,7 +2694,7 @@ types: vehicle: vehicle¦s @a fishingstate: fishing state¦s @a equipmentslot: equipment slot¦s @an - + villagercareerchangereason: villager career change reason¦s @a # Skript weathertype: weather type¦s @a diff --git a/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVillagerCareerChangeTest.java b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVillagerCareerChangeTest.java new file mode 100644 index 00000000000..da081cd5f09 --- /dev/null +++ b/src/test/java/org/skriptlang/skript/test/tests/syntaxes/events/EvtVillagerCareerChangeTest.java @@ -0,0 +1,36 @@ +package org.skriptlang.skript.test.tests.syntaxes.events; + +import ch.njol.skript.test.runner.SkriptJUnitTest; +import org.bukkit.Bukkit; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Villager; +import org.bukkit.entity.Villager.Profession; +import org.bukkit.event.entity.VillagerCareerChangeEvent; +import org.bukkit.event.entity.VillagerCareerChangeEvent.ChangeReason; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +public class EvtVillagerCareerChangeTest extends SkriptJUnitTest { + + private Villager villager; + + @Before + public void setup() { + villager = (Villager) getTestWorld().spawnEntity(getTestLocation(), EntityType.VILLAGER); + villager.setProfession(Profession.CLERIC); + } + + @Test + public void test() { + VillagerCareerChangeEvent event = new VillagerCareerChangeEvent(villager, Profession.ARMORER, ChangeReason.EMPLOYED); + Bukkit.getPluginManager().callEvent(event); + } + + @After + public void cleanup() { + if (villager != null) + villager.remove(); + } + +} diff --git a/src/test/skript/junit/EvtVillagerCareerChangeTest.sk b/src/test/skript/junit/EvtVillagerCareerChangeTest.sk new file mode 100644 index 00000000000..41eeab945d5 --- /dev/null +++ b/src/test/skript/junit/EvtVillagerCareerChangeTest.sk @@ -0,0 +1,20 @@ +options: + test: "org.skriptlang.skript.test.tests.syntaxes.events.EvtVillagerCareerChangeTest" + +test "VillagerCareerChange" when running JUnit: + set {_tests::*} to "event called", "past profession is cleric", "profession is armorer", and "profession changed" + add "career change reason is employment" to {_tests::*} + ensure {@test} completes {_tests::*} + +on villager career change: + junit test is {@test} + complete "event called" for {@test} + if past event-villager profession is cleric profession: + complete "past profession is cleric" for {@test} + if event-villager profession is armorer profession: + complete "profession is armorer" for {@test} + set event-villager profession to butcher profession + if event-villager profession is butcher profession: + complete "profession changed" for {@test} + if event-career change reason is employment: + complete "career change reason is employment" for {@test}