Skip to content

Commit 0d33fdd

Browse files
Brewing Stand Support (#7275)
* Initial Commit * Tests * Fix JUnit 17 * Requested Changes * Changes * Update EventValues * Requested Changes * Update Test * Requested Changes * Update EvtItem.java * Partial Changes * Update EvtItem.java * Brewing Results Changer * Update ExprBrewingTime.java * Changes * Pickle's Changes * Requested Changes * Apply suggestions from code review Co-authored-by: Efnilite <[email protected]> * Module * Update SimpleEvents.java
1 parent 8cbbb83 commit 0d33fdd

File tree

16 files changed

+1046
-8
lines changed

16 files changed

+1046
-8
lines changed

src/main/java/ch/njol/skript/Skript.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@
9292
import org.junit.runner.notification.Failure;
9393
import org.skriptlang.skript.bukkit.SkriptMetrics;
9494
import org.skriptlang.skript.bukkit.breeding.BreedingModule;
95+
import org.skriptlang.skript.bukkit.brewing.BrewingModule;
9596
import org.skriptlang.skript.bukkit.damagesource.DamageSourceModule;
9697
import org.skriptlang.skript.bukkit.displays.DisplayModule;
9798
import org.skriptlang.skript.bukkit.fishing.FishingModule;
@@ -588,7 +589,11 @@ public void onEnable() {
588589
TagModule.load();
589590
FurnaceModule.load();
590591
LootTableModule.load();
591-
skript.loadModules(new DamageSourceModule(), new ItemComponentModule());
592+
skript.loadModules(
593+
new DamageSourceModule(),
594+
new ItemComponentModule(),
595+
new BrewingModule()
596+
);
592597
} catch (final Exception e) {
593598
exception(e, "Could not load required .class files: " + e.getLocalizedMessage());
594599
setEnabled(false);

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

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,6 @@ public class EvtItem extends SkriptEvent {
7373
.examples("on pick up:", "on entity pickup of wheat:")
7474
.since("unknown (before 2.1), 2.5 (entity)")
7575
.keywords("pickup");
76-
// TODO brew event
77-
// Skript.registerEvent("Brew", EvtItem.class, BrewEvent.class, "brew[ing] [[of] %itemtypes%]")
78-
// .description("Called when a potion finished brewing.")
79-
// .examples("on brew:")
80-
// .since("2.0");
8176
Skript.registerEvent("Consume", EvtItem.class, PlayerItemConsumeEvent.class, "[player] ((eat|drink)[ing]|consum(e|ing)) [[of] %-itemtypes%]")
8277
.description("Called when a player is done eating/drinking something, e.g. an apple, bread, meat, milk or a potion.")
8378
.examples("on consume:")
@@ -184,8 +179,6 @@ public boolean check(final Event event) {
184179
itemStack = playerPickupItemEvent.getItem().getItemStack();
185180
} else if (event instanceof PlayerItemConsumeEvent playerItemConsumeEvent) {
186181
itemStack = playerItemConsumeEvent.getItem();
187-
// } else if (e instanceof BrewEvent)
188-
// itemStack = ((BrewEvent) e).getContents().getContents()
189182
} else if (event instanceof InventoryClickEvent inventoryClickEvent) {
190183
itemStack = inventoryClickEvent.getCurrentItem();
191184
} else if (event instanceof ItemDespawnEvent itemDespawnEvent) {
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package org.skriptlang.skript.bukkit.brewing;
2+
3+
import org.skriptlang.skript.addon.AddonModule;
4+
import org.skriptlang.skript.addon.SkriptAddon;
5+
import org.skriptlang.skript.bukkit.brewing.elements.CondBrewingConsume;
6+
import org.skriptlang.skript.bukkit.brewing.elements.EffBrewingConsume;
7+
import org.skriptlang.skript.bukkit.brewing.elements.EvtBrewingComplete;
8+
import org.skriptlang.skript.bukkit.brewing.elements.EvtBrewingFuel;
9+
import org.skriptlang.skript.bukkit.brewing.elements.EvtBrewingStart;
10+
import org.skriptlang.skript.bukkit.brewing.elements.ExprBrewingFuelLevel;
11+
import org.skriptlang.skript.bukkit.brewing.elements.ExprBrewingResults;
12+
import org.skriptlang.skript.bukkit.brewing.elements.ExprBrewingSlot;
13+
import org.skriptlang.skript.bukkit.brewing.elements.ExprBrewingTime;
14+
import org.skriptlang.skript.registration.SyntaxRegistry;
15+
16+
import java.util.Arrays;
17+
import java.util.function.Consumer;
18+
19+
public class BrewingModule implements AddonModule {
20+
21+
@Override
22+
public void load(SkriptAddon addon) {
23+
register(addon.syntaxRegistry(),
24+
25+
CondBrewingConsume::register,
26+
27+
EffBrewingConsume::register,
28+
29+
EvtBrewingComplete::register,
30+
EvtBrewingFuel::register,
31+
EvtBrewingStart::register,
32+
33+
ExprBrewingFuelLevel::register,
34+
ExprBrewingResults::register,
35+
ExprBrewingSlot::register,
36+
ExprBrewingTime::register
37+
);
38+
}
39+
40+
private void register(SyntaxRegistry registry, Consumer<SyntaxRegistry>... consumers) {
41+
Arrays.stream(consumers).forEach(consumer -> consumer.accept(registry));
42+
}
43+
44+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package org.skriptlang.skript.bukkit.brewing.elements;
2+
3+
import ch.njol.skript.doc.Description;
4+
import ch.njol.skript.doc.Events;
5+
import ch.njol.skript.doc.Example;
6+
import ch.njol.skript.doc.Name;
7+
import ch.njol.skript.doc.Since;
8+
import ch.njol.skript.lang.Condition;
9+
import ch.njol.skript.lang.EventRestrictedSyntax;
10+
import ch.njol.skript.lang.Expression;
11+
import ch.njol.skript.lang.SkriptParser.ParseResult;
12+
import ch.njol.util.Kleenean;
13+
import ch.njol.util.coll.CollectionUtils;
14+
import org.bukkit.event.Event;
15+
import org.bukkit.event.inventory.BrewingStandFuelEvent;
16+
import org.jetbrains.annotations.Nullable;
17+
import org.skriptlang.skript.registration.SyntaxInfo;
18+
import org.skriptlang.skript.registration.SyntaxRegistry;
19+
20+
@Name("Brewing Will Consume Fuel")
21+
@Description("""
22+
Checks if the 'brewing fuel' event will consume fuel.
23+
Preventing the fuel from being consumed will keep the fuel item and still add to the fuel level of the brewing stand.
24+
""")
25+
@Example("""
26+
on brewing fuel:
27+
if the brewing stand will consume the fuel:
28+
prevent the brewing stand from consuming the fuel
29+
""")
30+
@Since("INSERT VERSION")
31+
@Events("Brewing Fuel")
32+
public class CondBrewingConsume extends Condition implements EventRestrictedSyntax {
33+
34+
public static void register(SyntaxRegistry registry) {
35+
registry.register(
36+
SyntaxRegistry.CONDITION,
37+
SyntaxInfo.builder(CondBrewingConsume.class)
38+
.addPatterns(
39+
"[the] brewing stand will consume [the] fuel",
40+
"[the] brewing stand (will not|won't) consume [the] fuel"
41+
)
42+
.supplier(CondBrewingConsume::new)
43+
.build()
44+
);
45+
}
46+
47+
private boolean willConsume;
48+
49+
@Override
50+
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
51+
willConsume = matchedPattern == 0;
52+
return true;
53+
}
54+
55+
@Override
56+
public Class<? extends Event>[] supportedEvents() {
57+
return CollectionUtils.array(BrewingStandFuelEvent.class);
58+
}
59+
60+
@Override
61+
public boolean check(Event event) {
62+
if (!(event instanceof BrewingStandFuelEvent brewingStandFuelEvent))
63+
return false;
64+
return brewingStandFuelEvent.isConsuming() == willConsume;
65+
}
66+
67+
@Override
68+
public String toString(@Nullable Event event, boolean debug) {
69+
return "the brewing stand will" + (willConsume ? "" : " not") + " consume the fuel";
70+
}
71+
72+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package org.skriptlang.skript.bukkit.brewing.elements;
2+
3+
import ch.njol.skript.doc.Description;
4+
import ch.njol.skript.doc.Events;
5+
import ch.njol.skript.doc.Example;
6+
import ch.njol.skript.doc.Name;
7+
import ch.njol.skript.doc.Since;
8+
import ch.njol.skript.lang.Effect;
9+
import ch.njol.skript.lang.EventRestrictedSyntax;
10+
import ch.njol.skript.lang.Expression;
11+
import ch.njol.skript.lang.SkriptParser.ParseResult;
12+
import ch.njol.util.Kleenean;
13+
import ch.njol.util.coll.CollectionUtils;
14+
import org.bukkit.event.Event;
15+
import org.bukkit.event.inventory.BrewingStandFuelEvent;
16+
import org.jetbrains.annotations.Nullable;
17+
import org.skriptlang.skript.registration.SyntaxInfo;
18+
import org.skriptlang.skript.registration.SyntaxRegistry;
19+
20+
@Name("Consume Brewing Fuel")
21+
@Description("""
22+
Makes the brewing stand in a brewing fuel event consume its fuel.
23+
Preventing the fuel from being consumed will keep the fuel item and still add to the fuel level of the brewing stand.
24+
""")
25+
@Example("""
26+
on brewing fuel consumption:
27+
prevent the brewing stand from consuming the fuel
28+
""")
29+
@Since("INSERT VERSION")
30+
@Events("Brewing Fuel")
31+
public class EffBrewingConsume extends Effect implements EventRestrictedSyntax {
32+
33+
public static void register(SyntaxRegistry registry) {
34+
registry.register(
35+
SyntaxRegistry.EFFECT,
36+
SyntaxInfo.builder(EffBrewingConsume.class)
37+
.addPatterns(
38+
"make [the] brewing stand consume [its|the] fuel",
39+
"prevent [the] brewing stand from consuming [its|the] fuel"
40+
)
41+
.supplier(EffBrewingConsume::new)
42+
.build()
43+
);
44+
}
45+
46+
private boolean consume;
47+
48+
@Override
49+
public boolean init(Expression<?>[] exprs, int matchedPattern, Kleenean isDelayed, ParseResult parseResult) {
50+
consume = matchedPattern == 0;
51+
return true;
52+
}
53+
54+
@Override
55+
public Class<? extends Event>[] supportedEvents() {
56+
return CollectionUtils.array(BrewingStandFuelEvent.class);
57+
}
58+
59+
@Override
60+
protected void execute(Event event) {
61+
if (!(event instanceof BrewingStandFuelEvent brewingStandFuelEvent))
62+
return;
63+
brewingStandFuelEvent.setConsuming(consume);
64+
}
65+
66+
@Override
67+
public String toString(@Nullable Event event, boolean debug) {
68+
if (consume)
69+
return "make the brewing stand consume the fuel";
70+
return "prevent the brewing stand from consuming the fuel";
71+
}
72+
73+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package org.skriptlang.skript.bukkit.brewing.elements;
2+
3+
import ch.njol.skript.aliases.ItemType;
4+
import ch.njol.skript.lang.Literal;
5+
import ch.njol.skript.lang.SkriptEvent;
6+
import ch.njol.skript.lang.SkriptParser.ParseResult;
7+
import ch.njol.skript.lang.SyntaxStringBuilder;
8+
import org.bukkit.event.Event;
9+
import org.bukkit.event.inventory.BrewEvent;
10+
import org.bukkit.inventory.ItemStack;
11+
import org.bukkit.inventory.meta.PotionMeta;
12+
import org.bukkit.potion.PotionEffect;
13+
import org.bukkit.potion.PotionEffectType;
14+
import org.jetbrains.annotations.Nullable;
15+
import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys;
16+
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
17+
import org.skriptlang.skript.registration.SyntaxRegistry;
18+
19+
import java.util.List;
20+
21+
public class EvtBrewingComplete extends SkriptEvent {
22+
23+
public static void register(SyntaxRegistry registry) {
24+
registry.register(
25+
BukkitRegistryKeys.EVENT,
26+
BukkitSyntaxInfos.Event.builder(EvtBrewingComplete.class, "Brewing Complete")
27+
.addEvent(BrewEvent.class)
28+
.addPatterns("brew[ing] [complet[ed|ion]|finish[ed]] [(of|for) %-itemtypes/potioneffecttypes%]")
29+
.addDescription("Called when a brewing stand finishes brewing an ingredient and changes the potions.")
30+
.addExample("""
31+
on brew:
32+
broadcast event-item
33+
on brewing of speed potion:
34+
on brew finished for speed 2 potion:
35+
""")
36+
.addSince("INSERT VERSION")
37+
.supplier(EvtBrewingComplete::new)
38+
.build()
39+
);
40+
}
41+
42+
private @Nullable Literal<?> types;
43+
44+
@Override
45+
public boolean init(Literal<?>[] args, int matchedPattern, ParseResult parseResult) {
46+
types = args[0];
47+
return true;
48+
}
49+
50+
@Override
51+
public boolean check(Event event) {
52+
if (!(event instanceof BrewEvent brewEvent))
53+
return false;
54+
if (types == null)
55+
return true;
56+
57+
List<ItemStack> itemStacks = brewEvent.getResults();
58+
for (Object object : types.getArray()) {
59+
if (object instanceof ItemType itemType) {
60+
for (ItemStack itemStack : itemStacks) {
61+
if (itemType.isOfType(itemStack))
62+
return true;
63+
}
64+
} else if (object instanceof PotionEffectType potionEffectType) {
65+
for (ItemStack itemStack : itemStacks) {
66+
if (itemStack.getItemMeta() instanceof PotionMeta potionMeta) {
67+
for (PotionEffect potionEffect : potionMeta.getAllEffects()) {
68+
if (potionEffect.getType() == potionEffectType)
69+
return true;
70+
}
71+
}
72+
}
73+
}
74+
}
75+
return false;
76+
}
77+
78+
@Override
79+
public String toString(@Nullable Event event, boolean debug) {
80+
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
81+
builder.append("brewing complete");
82+
if (types != null)
83+
builder.append("for", types);
84+
return builder.toString();
85+
}
86+
87+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package org.skriptlang.skript.bukkit.brewing.elements;
2+
3+
import ch.njol.skript.aliases.ItemType;
4+
import ch.njol.skript.lang.Literal;
5+
import ch.njol.skript.lang.SkriptEvent;
6+
import ch.njol.skript.lang.SkriptParser.ParseResult;
7+
import ch.njol.skript.lang.SyntaxStringBuilder;
8+
import ch.njol.skript.registrations.EventValues;
9+
import org.bukkit.event.Event;
10+
import org.bukkit.event.inventory.BrewingStandFuelEvent;
11+
import org.bukkit.inventory.ItemStack;
12+
import org.jetbrains.annotations.Nullable;
13+
import org.skriptlang.skript.bukkit.registration.BukkitRegistryKeys;
14+
import org.skriptlang.skript.bukkit.registration.BukkitSyntaxInfos;
15+
import org.skriptlang.skript.registration.SyntaxRegistry;
16+
17+
public class EvtBrewingFuel extends SkriptEvent {
18+
19+
public static void register(SyntaxRegistry registry) {
20+
registry.register(
21+
BukkitRegistryKeys.EVENT,
22+
BukkitSyntaxInfos.Event.builder(EvtBrewingFuel.class, "Brewing Fuel")
23+
.addEvent(BrewingStandFuelEvent.class)
24+
.addPatterns(
25+
"brew[ing [stand]] consum(e|ing) fuel [of %-itemtypes%]",
26+
"brew[ing [stand]] fuel consumption [of %-itemtypes%]"
27+
)
28+
.addDescription("Called when a brewing stand is about to use an item to increase its fuel level.")
29+
.addExample("""
30+
on brewing consume fuel:
31+
prevent the brewing stand from consuming fuel
32+
on brewing fuel consumption of blaze powder:
33+
""")
34+
.addSince("INSERT VERSION")
35+
.supplier(EvtBrewingFuel::new)
36+
.build()
37+
);
38+
39+
EventValues.registerEventValue(BrewingStandFuelEvent.class, ItemStack.class, BrewingStandFuelEvent::getFuel);
40+
}
41+
42+
private Literal<ItemType> items;
43+
44+
@Override
45+
public boolean init(Literal<?>[] args, int matchedPattern, ParseResult parseResult) {
46+
//noinspection unchecked
47+
items = (Literal<ItemType>) args[0];
48+
return true;
49+
}
50+
51+
@Override
52+
public boolean check(Event event) {
53+
if (!(event instanceof BrewingStandFuelEvent brewingStandFuelEvent))
54+
return false;
55+
if (items == null)
56+
return true;
57+
58+
ItemStack itemStack = brewingStandFuelEvent.getFuel();
59+
for (ItemType itemType : items.getArray()) {
60+
if (itemType.isOfType(itemStack))
61+
return true;
62+
}
63+
return false;
64+
}
65+
66+
@Override
67+
public String toString(@Nullable Event event, boolean debug) {
68+
SyntaxStringBuilder builder = new SyntaxStringBuilder(event, debug);
69+
builder.append("brewing stand fuel consumption");
70+
if (items != null)
71+
builder.append("of", items);
72+
return builder.toString();
73+
}
74+
75+
}

0 commit comments

Comments
 (0)