/
MaterialAge.java
156 lines (135 loc) · 4.95 KB
/
MaterialAge.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
package com.denizenscript.denizen.objects.properties.material;
import com.denizenscript.denizen.objects.MaterialTag;
import com.denizenscript.denizencore.objects.core.ElementTag;
import com.denizenscript.denizencore.objects.Mechanism;
import com.denizenscript.denizencore.objects.ObjectTag;
import com.denizenscript.denizencore.objects.properties.Property;
import com.denizenscript.denizencore.objects.properties.PropertyParser;
import org.bukkit.block.data.Ageable;
import org.bukkit.block.data.type.Sapling;
import org.bukkit.block.data.type.TurtleEgg;
public class MaterialAge implements Property {
public static boolean describes(ObjectTag material) {
return material instanceof MaterialTag
&& ((MaterialTag) material).hasModernData()
&& (((MaterialTag) material).getModernData().data instanceof Ageable
|| ((MaterialTag) material).getModernData().data instanceof TurtleEgg
|| ((MaterialTag) material).getModernData().data instanceof Sapling);
}
public static MaterialAge getFrom(ObjectTag _material) {
if (!describes(_material)) {
return null;
}
else {
return new MaterialAge((MaterialTag) _material);
}
}
public static final String[] handledMechs = new String[] {
"age", "plant_growth"
};
private MaterialAge(MaterialTag _material) {
material = _material;
}
MaterialTag material;
public static void registerTags() {
// <--[tag]
// @attribute <MaterialTag.maximum_age>
// @returns ElementTag(Number)
// @group properties
// @description
// Returns the maximum age for an ageable material. This includes plant growth.
// -->
PropertyParser.PropertyTag<MaterialAge> runnable = (attribute, material) -> {
return new ElementTag(material.getMax());
};
PropertyParser.registerTag("maximum_age", runnable);
PropertyParser.registerTag("maximum_plant_growth", runnable);
// <--[tag]
// @attribute <MaterialTag.age>
// @returns ElementTag(Number)
// @mechanism MaterialTag.age
// @group properties
// @description
// Returns the current age for an ageable material. This includes plant growth.
// -->
runnable = (attribute, material) -> {
return new ElementTag(material.getCurrent());
};
PropertyParser.registerTag("age", runnable);
PropertyParser.registerTag("plant_growth", runnable);
}
public TurtleEgg getTurtleEgg() {
return (TurtleEgg) material.getModernData().data;
}
public boolean isTurtleEgg() {
return material.getModernData().data instanceof TurtleEgg;
}
public Sapling getSapling() {
return (Sapling) material.getModernData().data;
}
public boolean isSapling() {
return material.getModernData().data instanceof Sapling;
}
public Ageable getAgeable() {
return (Ageable) material.getModernData().data;
}
public int getCurrent() {
if (isTurtleEgg()) {
return getTurtleEgg().getHatch();
}
else if (isSapling()) {
return getSapling().getStage();
}
else {
return getAgeable().getAge();
}
}
public int getMax() {
if (isTurtleEgg()) {
return getTurtleEgg().getMaximumHatch();
}
else if (isSapling()) {
return getSapling().getMaximumStage();
}
else {
return getAgeable().getMaximumAge();
}
}
@Override
public String getPropertyString() {
return String.valueOf(getCurrent());
}
@Override
public String getPropertyId() {
return "age";
}
@Override
public void adjust(Mechanism mechanism) {
// <--[mechanism]
// @object MaterialTag
// @name age
// @input ElementTag(Number)
// @description
// Sets an ageable material's current age. This includes plant growth.
// @tags
// <MaterialTag.age>
// <MaterialTag.maximum_age>
// -->
if ((mechanism.matches("age") || mechanism.matches("plant_growth")) && mechanism.requireInteger()) {
int age = mechanism.getValue().asInt();
if (age < 0 || age > getMax()) {
mechanism.echoError("Age value '" + age + "' is not valid. Must be between 0 and " + getMax() + " for material '" + material.name() + "'.");
return;
}
if (isTurtleEgg()) {
getTurtleEgg().setHatch(age);
}
else if (isSapling()) {
getSapling().setStage(age);
}
else {
getAgeable().setAge(age);
}
}
}
}