Skip to content

Commit 7f728c2

Browse files
Merge branch 'dev/feature' into dev/ExprCenterLocations
2 parents 47bf66b + 77173b2 commit 7f728c2

File tree

16 files changed

+507
-122
lines changed

16 files changed

+507
-122
lines changed

src/main/java/ch/njol/skript/classes/data/BukkitClasses.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
import org.bukkit.event.entity.EntityRegainHealthEvent.RegainReason;
4343
import org.bukkit.event.entity.EntityTransformEvent.TransformReason;
4444
import org.bukkit.event.entity.EntityUnleashEvent;
45+
import org.bukkit.event.entity.VillagerCareerChangeEvent;
4546
import org.bukkit.event.inventory.ClickType;
4647
import org.bukkit.event.inventory.InventoryAction;
4748
import org.bukkit.event.inventory.InventoryCloseEvent;
@@ -1576,6 +1577,13 @@ public String toVariableNameString(WorldBorder border) {
15761577
.requiredPlugins("Minecraft 1.21.5+")
15771578
.documentationId("PigVariant"));
15781579

1580+
Classes.registerClass(new EnumClassInfo<>(VillagerCareerChangeEvent.ChangeReason.class, "villagercareerchangereason", "villager career change reasons")
1581+
.user("(villager )?career ?change ?reasons?")
1582+
.name("Villager Career Change Reason")
1583+
.description("Represents a reason why a villager changed its career.")
1584+
.since("INSERT VERSION")
1585+
);
1586+
15791587
}
15801588

15811589
/**

src/main/java/ch/njol/skript/classes/data/BukkitEventValues.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.bukkit.command.BlockCommandSender;
3333
import org.bukkit.command.CommandSender;
3434
import org.bukkit.entity.*;
35+
import org.bukkit.entity.Villager.Profession;
3536
import org.bukkit.event.block.*;
3637
import org.bukkit.event.enchantment.EnchantItemEvent;
3738
import org.bukkit.event.enchantment.PrepareItemEnchantEvent;
@@ -770,6 +771,23 @@ public void set(VaultDisplayItemEvent event, @Nullable ItemStack itemStack) {
770771
});
771772
}
772773

774+
EventValues.registerEventValue(VillagerCareerChangeEvent.class, VillagerCareerChangeEvent.ChangeReason.class, VillagerCareerChangeEvent::getReason);
775+
EventValues.registerEventValue(VillagerCareerChangeEvent.class, Villager.Profession.class, new EventConverter<>() {
776+
@Override
777+
public void set(VillagerCareerChangeEvent event, @Nullable Profession profession) {
778+
if (profession == null)
779+
return;
780+
event.setProfession(profession);
781+
}
782+
783+
@Override
784+
public Profession convert(VillagerCareerChangeEvent event) {
785+
return event.getProfession();
786+
}
787+
});
788+
EventValues.registerEventValue(VillagerCareerChangeEvent.class, Villager.Profession.class,
789+
event -> event.getEntity().getProfession(), TIME_PAST);
790+
773791
}
774792

775793
}

src/main/java/ch/njol/skript/events/SimpleEvents.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -786,6 +786,20 @@ public class SimpleEvents {
786786
.since("INSERT VERSION")
787787
.requiredPlugins("Minecraft 1.21.1+");
788788
}
789+
790+
Skript.registerEvent("Villager Career Change", SimpleEvent.class, VillagerCareerChangeEvent.class,
791+
"villager career chang(e[d]|ing)")
792+
.description("Called when a villager changes its career. Can be caused by being employed or losing their job.")
793+
.examples("""
794+
on villager career change:
795+
if all:
796+
event-career change reason is employment
797+
event-villager profession is armorer profession
798+
then:
799+
cancel event
800+
""")
801+
.since("INSERT VERSION");
802+
789803
}
790804

791805
}
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
package ch.njol.skript.expressions;
2+
3+
import ch.njol.skript.Skript;
4+
import ch.njol.skript.classes.Changer;
5+
import ch.njol.skript.classes.Changer.ChangeMode;
6+
import ch.njol.skript.doc.*;
7+
import ch.njol.skript.expressions.base.SimplePropertyExpression;
8+
import ch.njol.util.coll.CollectionUtils;
9+
import org.bukkit.block.Block;
10+
import org.bukkit.block.BrushableBlock;
11+
import org.bukkit.block.BlockState;
12+
import org.bukkit.event.Event;
13+
import org.bukkit.inventory.ItemStack;
14+
import org.jetbrains.annotations.Nullable;
15+
16+
@Name("Buried Item")
17+
@Description({
18+
"Represents the item that is uncovered when dusting.",
19+
"The only blocks that can currently be \"dusted\" are Suspicious Gravel and Suspicious Sand."
20+
})
21+
@Examples({
22+
"send target block's brushable item",
23+
"set {_gravel}'s brushable item to emerald"
24+
})
25+
@Since("INSERT VERSION")
26+
@RequiredPlugins("Minecraft 1.20+")
27+
public class ExprBrushableItem extends SimplePropertyExpression<Block, ItemStack> {
28+
29+
private static final boolean SUPPORTS_DUSTING = Skript.classExists("org.bukkit.block.BrushableBlock");
30+
31+
static {
32+
if (SUPPORTS_DUSTING)
33+
register(ExprBrushableItem.class, ItemStack.class,
34+
"(brushable|buried) item",
35+
"blocks");
36+
}
37+
38+
@Override
39+
public @Nullable ItemStack convert(Block block) {
40+
if (block.getState() instanceof BrushableBlock brushableBlock) {
41+
return brushableBlock.getItem();
42+
}
43+
return null;
44+
}
45+
46+
@Override
47+
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
48+
if (mode == ChangeMode.SET || mode == ChangeMode.DELETE) {
49+
return CollectionUtils.array(ItemStack.class);
50+
}
51+
return null;
52+
}
53+
54+
@Override
55+
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
56+
if (mode == ChangeMode.SET || mode == ChangeMode.DELETE) {
57+
ItemStack newItem = (mode == ChangeMode.SET) ? (ItemStack) delta[0] : null;
58+
for (Block block : getExpr().getArray(event)) {
59+
BlockState state = block.getState();
60+
if (state instanceof BrushableBlock brushableBlock) {
61+
brushableBlock.setItem(newItem);
62+
state.update();
63+
}
64+
}
65+
}
66+
}
67+
68+
@Override
69+
public Class<? extends ItemStack> getReturnType() {
70+
return ItemStack.class;
71+
}
72+
73+
@Override
74+
protected String getPropertyName() {
75+
return "brushable item";
76+
}
77+
78+
}
Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
package ch.njol.skript.expressions;
2+
3+
import ch.njol.skript.Skript;
4+
import ch.njol.skript.classes.Changer.ChangeMode;
5+
import ch.njol.skript.doc.*;
6+
import ch.njol.skript.expressions.base.PropertyExpression;
7+
import ch.njol.skript.lang.Expression;
8+
import ch.njol.skript.lang.SkriptParser.ParseResult;
9+
import ch.njol.util.Kleenean;
10+
import ch.njol.util.coll.CollectionUtils;
11+
import org.bukkit.block.Block;
12+
import org.bukkit.block.data.BlockData;
13+
import org.bukkit.block.data.Brushable;
14+
import org.bukkit.event.Event;
15+
import org.jetbrains.annotations.Nullable;
16+
17+
@Name("Dusted Stage")
18+
@Description({
19+
"Represents how far the block has been uncovered.",
20+
"The only blocks that can currently be \"dusted\" are Suspicious Gravel and Suspicious Sand."
21+
})
22+
@Examples({
23+
"send target block's maximum dusted stage",
24+
"set {_sand}'s dusted stage to 2"
25+
})
26+
@Since("INSERT VERSION")
27+
@RequiredPlugins("Minecraft 1.20+")
28+
public class ExprDustedStage extends PropertyExpression<Object, Integer> {
29+
30+
private static final boolean SUPPORTS_DUSTING = Skript.classExists("org.bukkit.block.data.Brushable");
31+
32+
static {
33+
if (SUPPORTS_DUSTING)
34+
register(ExprDustedStage.class, Integer.class,
35+
"[:max[imum]] dust[ed|ing] (value|stage|progress[ion])",
36+
"blocks/blockdatas");
37+
}
38+
39+
private boolean isMax;
40+
41+
@Override
42+
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
43+
setExpr((Expression<Block>) exprs[0]);
44+
isMax = parseResult.hasTag("max");
45+
return true;
46+
}
47+
48+
@Override
49+
protected Integer @Nullable [] get(Event event, Object[] source) {
50+
return get(source, obj -> {
51+
Brushable brushable = getBrushable(obj);
52+
if (brushable != null) {
53+
return isMax ? brushable.getMaximumDusted() : brushable.getDusted();
54+
}
55+
return null;
56+
});
57+
}
58+
59+
@Override
60+
public Class<?> @Nullable [] acceptChange(ChangeMode mode) {
61+
if (isMax) {
62+
Skript.error("Attempting to modify the max dusted stage is not supported.");
63+
return null;
64+
}
65+
66+
return switch (mode) {
67+
case SET, ADD, REMOVE, RESET -> CollectionUtils.array(Integer.class);
68+
default -> null;
69+
};
70+
}
71+
72+
@Override
73+
public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
74+
if (isMax) return;
75+
Integer value = (delta != null && delta.length > 0) ? (Integer) delta[0] : null;
76+
77+
for (Object obj : getExpr().getArray(event)) {
78+
Brushable brushable = getBrushable(obj);
79+
if (brushable == null)
80+
continue;
81+
82+
int currentValue = brushable.getDusted();
83+
int maxValue = brushable.getMaximumDusted();
84+
int newValue = currentValue;
85+
86+
switch (mode) {
87+
case SET -> {
88+
if (value != null) {
89+
newValue = value;
90+
}
91+
}
92+
case ADD -> {
93+
if (value != null) {
94+
newValue = currentValue + value;
95+
}
96+
}
97+
case REMOVE -> {
98+
if (value != null) {
99+
newValue = currentValue - value;
100+
}
101+
}
102+
case RESET -> newValue = 0;
103+
default -> {
104+
return;
105+
}
106+
}
107+
108+
newValue = Math.max(0, Math.min(newValue, maxValue));
109+
110+
brushable.setDusted(newValue);
111+
if (obj instanceof Block) {
112+
((Block) obj).setBlockData(brushable);
113+
}
114+
}
115+
}
116+
117+
@Nullable
118+
private Brushable getBrushable(Object obj) {
119+
if (obj instanceof Block block) {
120+
BlockData blockData = block.getBlockData();
121+
if (blockData instanceof Brushable)
122+
return (Brushable) blockData;
123+
} else if (obj instanceof Brushable brushable) {
124+
return brushable;
125+
}
126+
return null;
127+
}
128+
129+
130+
@Override
131+
public Class<? extends Integer> getReturnType() {
132+
return Integer.class;
133+
}
134+
135+
@Override
136+
public String toString(@Nullable Event event, boolean debug) {
137+
return getExpr().toString(event, debug) + "'s " + (isMax ? "maximum " : "") + " dusted stage";
138+
}
139+
140+
}

0 commit comments

Comments
 (0)