20
20
@ Name ("Villager Level/Experience" )
21
21
@ Description ({
22
22
"Represents the level/experience of a villager." ,
23
- "The level will determine which trades are available to players." ,
23
+ "The level will determine which trades are available to players (value between 1 and 5, defaults to 1)." ,
24
+ "When a villager's level is 1, they may lose their profession if they don't have a workstation." ,
24
25
"Experience works along with the leveling system, determining which level the villager will move to." ,
25
- "Level must be between 1 and 5, with 1 being the default level." ,
26
- "When a villager's level is 1, they may lose their profession." ,
27
- "Experience must be greater than or equal to 0."
26
+ "Experience must be greater than or equal to 0." ,
27
+ "Learn more about villager levels on <a href='https://minecraft.wiki/w/Villager#Trading'>Minecraft Wiki</a>" ,
28
28
})
29
29
@ Examples ({
30
30
"set {_level} to villager level of {_villager}" ,
@@ -61,8 +61,7 @@ public boolean init(Expression<?>[] expressions, int matchedPattern, Kleenean is
61
61
@ Override
62
62
public Class <?> @ Nullable [] acceptChange (ChangeMode mode ) {
63
63
return switch (mode ) {
64
- case SET , ADD , REMOVE , RESET ->
65
- CollectionUtils .array (Number .class );
64
+ case SET , ADD , REMOVE , RESET -> CollectionUtils .array (Number .class );
66
65
default -> null ;
67
66
};
68
67
}
@@ -75,20 +74,29 @@ public void change(Event event, Object @Nullable [] delta, ChangeMode mode) {
75
74
for (LivingEntity livingEntity : getExpr ().getArray (event )) {
76
75
if (!(livingEntity instanceof Villager villager )) continue ;
77
76
78
- int minLevel = experience ? 0 : 1 ;
79
- int maxLevel = experience ? Integer .MAX_VALUE : 5 ;
80
- int previousLevel = experience ? villager .getVillagerExperience () : villager .getVillagerLevel ();
77
+ int minLevel ;
78
+ int maxLevel ;
79
+ int previousAmount ;
80
+ if (experience ) {
81
+ minLevel = 0 ;
82
+ maxLevel = Integer .MAX_VALUE ;
83
+ previousAmount = villager .getVillagerExperience ();
84
+ } else {
85
+ minLevel = 1 ;
86
+ maxLevel = 5 ;
87
+ previousAmount = villager .getVillagerLevel ();
88
+ }
81
89
int newLevel = switch (mode ) {
82
90
case SET -> changeValue ;
83
- case ADD -> previousLevel + changeValue ;
84
- case REMOVE -> previousLevel - changeValue ;
91
+ case ADD -> previousAmount + changeValue ;
92
+ case REMOVE -> previousAmount - changeValue ;
85
93
default -> minLevel ;
86
94
};
87
- newLevel = Math2 .fit (minLevel , newLevel , maxLevel );
88
- if (experience )
95
+ newLevel = Math2 .fit (minLevel , newLevel , maxLevel );
96
+ if (experience ) {
89
97
villager .setVillagerExperience (newLevel );
90
- else if (newLevel > previousLevel && HAS_INCREASE_METHOD ) {
91
- int increase = Math2 .fit (minLevel , newLevel - previousLevel , maxLevel );
98
+ } else if (newLevel > previousAmount && HAS_INCREASE_METHOD ) {
99
+ int increase = Math2 .fit (minLevel , newLevel - previousAmount , maxLevel );
92
100
// According to the docs for this method:
93
101
// Increases the level of this villager.
94
102
// The villager will also unlock new recipes unlike the raw 'setVillagerLevel' method
0 commit comments